#include "ztype.h"
#include "zcom.h"
#include <stdio.h>

int encryptZTA(u64* plaintxt, int plen, u64* ciphertxt)
{
    static u8 s[16]={0x9,0xd,0x7,0x6,0xa,0xf,0x1,0x3,0xe,0x2,0x4,0x8,0xc,0x0,0xb,0x5};
    static u8 S[256]={0x43,0xda,0xd3,0xc5,0xeb,0xfc,0x96,0xa8,0xc6,0x71,0xae,0x74,0xde,0x16,0x03,0x24,
        0x8b,0x9a,0x80,0x92,0xa5,0xb6,0x90,0xba,0xc0,0xbd,0xa4,0x48,0x72,0x84,0x6c,0x2c,
        0xad,0x37,0xee,0x44,0x1f,0xb2,0xfd,0xdd,0x65,0xa0,0xf1,0x13,0xea,0xd0,0x45,0xf9,
        0xd9,0xe7,0xc1,0xc9,0x33,0x26,0x51,0x53,0x62,0x8f,0xcb,0x27,0x5b,0x4f,0x0f,0xa9,
        0x5c,0x42,0x1a,0x09,0x57,0xab,0x79,0x7c,0xce,0x75,0xe6,0x23,0x19,0x25,0xd4,0x17,
        0x60,0x70,0xfb,0x86,0xb4,0x32,0x88,0xd7,0x7a,0x8c,0x82,0xb1,0x52,0x8d,0x1c,0xa1,
        0xc2,0x08,0x77,0x12,0x39,0x5e,0x83,0x41,0xb8,0xc7,0x2a,0x15,0xcc,0x9b,0xff,0xe9,
        0x91,0xac,0x66,0x85,0x6f,0xb3,0xd2,0xb9,0xca,0x2b,0xdf,0xaf,0x1b,0x46,0xbf,0xed,
        0x55,0x9f,0x0b,0x97,0xd5,0xc4,0x8a,0xa2,0xd1,0x94,0x95,0x8e,0xd6,0xf6,0x40,0x7f,
        0x3a,0xbe,0xf8,0xfa,0x04,0x59,0x3d,0xf0,0x0a,0x9d,0x61,0x11,0xbc,0x07,0xd8,0x47,
        0x93,0xdb,0x1e,0xec,0x3f,0xf4,0xbb,0x3e,0x05,0x58,0xcd,0xaa,0x06,0xe8,0xc3,0xe4,
        0x73,0x35,0x98,0x4d,0x4e,0x87,0x63,0x64,0x0c,0x02,0xef,0x67,0x0d,0x28,0xf3,0x68,
        0x10,0x7d,0x69,0x6a,0x89,0x01,0x4a,0x0e,0x6d,0x6e,0x30,0x4b,0xe3,0x38,0x36,0xe0,
        0x21,0x78,0x2f,0x14,0xc8,0x6b,0xe2,0xcf,0x9e,0xe5,0x1d,0xf2,0x9c,0x50,0x7e,0x3b,
        0xfe,0x54,0x5a,0xf5,0x5d,0x29,0x4c,0xb0,0x3c,0x2d,0xa3,0xdc,0xf7,0x5f,0xe1,0x76,
        0x99,0x49,0x22,0x20,0x7b,0x81,0xb7,0x00,0xb5,0x31,0xa6,0x34,0x2e,0x18,0xa7,0x56};
    u32 a,b,c,d;
    u64 tempData64,y=0;
    int block;
    
    for(block = 0; block < plen; block++)
    {
        tempData64 = *(plaintxt+block);
        y=0;y |= (u64) S[(((tempData64>>56)&255)+111)&255]<<56;
        tempData64^=((y>>56)&0xff)<<0;
        y |=(u64) S[(((tempData64>>0)&255)-254)&255]<<0;
        y |=(u64) s[(((tempData64>>8)&15)+1)&15]<<8;
        y |=(u64) s[(((tempData64>>12)&15)-6)&15]<<12;
        y |=(u64) s[(((tempData64>>16)&15)-15)&15]<<16;
        c = (unsigned int)(tempData64>>20);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-66)&255];
        b=((3*((c>>8)&255)+251)&255)^a;
        b=S[(b+74)&255];
        a=((3*a+43)&255)^b;
        c = b<<8|a;
        d = ((3*d)+28051)^c;
        a=S[((d&255)+255)&255];
        b=((3*((d>>8)&255)+249)&255)^a;
        b=S[(b-142)&255];
        a=((3*a+25)&255)^b;
        d = b<<8|a;
        c = (((3*c)+13163)&65535)^d;
        y|=(u64)(d<<16|c)<<20;
        y |=(u64) s[(((tempData64>>52)&15)+7)&15]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x3cd7336b*b+0x891c6671);
        b ^=P(0x3cd7336b*a+0x891c6671);
        a ^=P(0x3cd7336b*b+0x891c6671);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>60)&15)-15)&15]<<60;
        tempData64^=((y>>60)&0xff)<<0;
        y |=(u64) S[(((tempData64>>0)&255)-66)&255]<<0;
        y |=(u64) s[(((tempData64>>8)&15)+10)&15]<<8;
        c = (unsigned int)(tempData64>>12);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-147)&255];
        b=((3*((c>>8)&255)+109)&255)^a;
        b=S[(b+255)&255];
        a=((3*a+249)&255)^b;
        c = b<<8|a;
        d = ((3*d)+6543)^c;
        a=S[((d&255)-107)&255];
        b=((3*((d>>8)&255)+51)&255)^a;
        b=S[(b+215)&255];
        a=((3*a+61)&255)^b;
        d = b<<8|a;
        c = (((3*c)+26225)&65535)^d;
        y|=(u64)(d<<16|c)<<12;
        y |=(u64) s[(((tempData64>>44)&15)-12)&15]<<44;
        y |=(u64) s[(((tempData64>>48)&15)-12)&15]<<48;
        y |=(u64) S[(((tempData64>>52)&255)-132)&255]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xff84df2f*b+0xcbb5cc39);
        b ^=P(0xff84df2f*a+0xcbb5cc39);
        a ^=P(0xff84df2f*b+0xcbb5cc39);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>36)&255)+255)&255]<<36;
        tempData64^=((y>>36)&0xffff)<<16;
        a=S[(((tempData64>>44)&255)-142)&255];
        b=((3*((tempData64>>52)&255)+25)&255)^a;
        b=S[(b-107)&255];
        a=((3*a+51)&255)^b;
        y |= (u64)(b<<8|a)<<44;
        y |=(u64) s[(((tempData64>>60)&15)+7)&15]<<60;
        a=S[(((tempData64>>0)&255)+112)&255];
        b=((3*((tempData64>>8)&255)+103)&255)^a;
        b=S[(b-28)&255];
        a=((3*a+137)&255)^b;
        y |= (u64)(b<<8|a)<<0;
        a=S[(((tempData64>>16)&255)-44)&255];
        b=((3*((tempData64>>24)&255)+223)&255)^a;
        b=S[(b-132)&255];
        a=((3*a+255)&255)^b;
        y |= (u64)(b<<8|a)<<16;
        y |=(u64) s[(((tempData64>>32)&15)+8)&15]<<32;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x5d7da813*b+0xf970c717);
        b ^=P(0x5d7da813*a+0xf970c717);
        a ^=P(0x5d7da813*b+0xf970c717);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>48)&15)+0)&15]<<48;
        y |=(u64) s[(((tempData64>>52)&15)-12)&15]<<52;
        y |=(u64) S[(((tempData64>>56)&255)-44)&255]<<56;
        c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-132)&255];
        b=((3*((c>>8)&255)+255)&255)^a;
        b=S[(b+56)&255];
        a=((3*a+205)&255)^b;
        c = b<<8|a;
        d = ((3*d)+52149)^c;
        a=S[((d&255)+19)&255];
        b=((3*((d>>8)&255)+169)&255)^a;
        b=S[(b-125)&255];
        a=((3*a+93)&255)^b;
        d = b<<8|a;
        c = (((3*c)+50967)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        a=S[(((tempData64>>32)&255)-112)&255];
        b=((3*((tempData64>>40)&255)+249)&255)^a;
        b=S[(b-17)&255];
        a=((3*a+127)&255)^b;
        y |= (u64)(b<<8|a)<<32;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xfdff7f13*b+0xf2af3111);
        b ^=P(0xfdff7f13*a+0xf2af3111);
        a ^=P(0xfdff7f13*b+0xf2af3111);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>56)&255)+56)&255]<<56;
        tempData64^=((y>>56)&0xf)<<0;
        y |=(u64) s[(((tempData64>>0)&15)-5)&15]<<0;
        c = (unsigned int)(tempData64>>4);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+19)&255];
        b=((3*((c>>8)&255)+169)&255)^a;
        b=S[(b-125)&255];
        a=((3*a+93)&255)^b;
        c = b<<8|a;
        d = ((3*d)+50967)^c;
        a=S[((d&255)-112)&255];
        b=((3*((d>>8)&255)+249)&255)^a;
        b=S[(b-17)&255];
        a=((3*a+127)&255)^b;
        d = b<<8|a;
        c = (((3*c)+65023)&65535)^d;
        y|=(u64)(d<<16|c)<<4;
        a=S[(((tempData64>>36)&255)-17)&255];
        b=((3*((tempData64>>44)&255)+49)&255)^a;
        b=S[(b+175)&255];
        a=((3*a+243)&255)^b;
        y |= (u64)(b<<8|a)<<36;
        y |=(u64) s[(((tempData64>>52)&15)-3)&15]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xcefe8943*b+0xeaef863f);
        b ^=P(0xcefe8943*a+0xeaef863f);
        a ^=P(0xcefe8943*b+0xeaef863f);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>56)&255)-22)&255]<<56;
        c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-112)&255];
        b=((3*((c>>8)&255)+249)&255)^a;
        b=S[(b-17)&255];
        a=((3*a+127)&255)^b;
        c = b<<8|a;
        d = ((3*d)+65023)^c;
        a=S[((d&255)-17)&255];
        b=((3*((d>>8)&255)+49)&255)^a;
        b=S[(b+175)&255];
        a=((3*a+243)&255)^b;
        d = b<<8|a;
        c = (((3*c)+35139)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64) s[(((tempData64>>32)&15)+14)&15]<<32;
        y |=(u64) S[(((tempData64>>36)&255)+63)&255]<<36;
        y |=(u64) s[(((tempData64>>44)&15)+15)&15]<<44;
        y |=(u64) s[(((tempData64>>48)&15)-11)&15]<<48;
        y |=(u64) s[(((tempData64>>52)&15)-5)&15]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x1d8587bb*b+0xf4126537);
        b ^=P(0x1d8587bb*a+0xf4126537);
        a ^=P(0x1d8587bb*b+0xf4126537);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>20)&15)-1)&15]<<20;
        tempData64^=((y>>20)&0xf)<<8;
        c = (unsigned int)(tempData64>>24);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+175)&255];
        b=((3*((c>>8)&255)+243)&255)^a;
        b=S[(b-67)&255];
        a=((3*a+137)&255)^b;
        c = b<<8|a;
        d = ((3*d)+52991)^c;
        a=S[((d&255)+63)&255];
        b=((3*((d>>8)&255)+135)&255)^a;
        b=S[(b+239)&255];
        a=((3*a+235)&255)^b;
        d = b<<8|a;
        c = (((3*c)+34747)&65535)^d;
        y|=(u64)(d<<16|c)<<24;
        y |=(u64) S[(((tempData64>>56)&255)-133)&255]<<56;
        y |=(u64) S[(((tempData64>>0)&255)-55)&255]<<0;
        y |=(u64) s[(((tempData64>>8)&15)+2)&15]<<8;
        y |=(u64) S[(((tempData64>>12)&255)-240)&255]<<12;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x8946bbf3*b+0xa569b02d);
        b ^=P(0x8946bbf3*a+0xa569b02d);
        a ^=P(0x8946bbf3*b+0xa569b02d);
        tempData64 = (u64)b<<32 | a;
        y=0;c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+63)&255];
        b=((3*((c>>8)&255)+135)&255)^a;
        b=S[(b+239)&255];
        a=((3*a+235)&255)^b;
        c = b<<8|a;
        d = ((3*d)+34747)^c;
        a=S[((d&255)-133)&255];
        b=((3*((d>>8)&255)+29)&255)^a;
        b=S[(b-55)&255];
        a=((3*a+101)&255)^b;
        d = b<<8|a;
        c = (((3*c)+62483)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64) s[(((tempData64>>32)&15)-0)&15]<<32;
        y |=(u64) s[(((tempData64>>36)&15)-6)&15]<<36;
        y |=(u64) S[(((tempData64>>40)&255)+44)&255]<<40;
        y |=(u64) S[(((tempData64>>48)&255)-105)&255]<<48;
        y |=(u64) s[(((tempData64>>56)&15)-3)&15]<<56;
        y |=(u64) s[(((tempData64>>60)&15)-10)&15]<<60;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xafcad373*b+0xb331bda3);
        b ^=P(0xafcad373*a+0xb331bda3);
        a ^=P(0xafcad373*b+0xb331bda3);
        tempData64 = (u64)b<<32 | a;
        y=0;c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-55)&255];
        b=((3*((c>>8)&255)+101)&255)^a;
        b=S[(b+18)&255];
        a=((3*a+245)&255)^b;
        c = b<<8|a;
        d = ((3*d)+48113)^c;
        a=S[((d&255)-70)&255];
        b=((3*((d>>8)&255)+137)&255)^a;
        b=S[(b+44)&255];
        a=((3*a+177)&255)^b;
        d = b<<8|a;
        c = (((3*c)+42345)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        tempData64^=((y>>0)&0xf)<<56;
        a=S[(((tempData64>>32)&255)-115)&255];
        b=((3*((tempData64>>40)&255)+211)&255)^a;
        b=S[(b-202)&255];
        a=((3*a+175)&255)^b;
        y |= (u64)(b<<8|a)<<32;
        y |=(u64) S[(((tempData64>>48)&255)-163)&255]<<48;
        y |=(u64) s[(((tempData64>>56)&15)-1)&15]<<56;
        y |=(u64) s[(((tempData64>>60)&15)+14)&15]<<60;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x70d06e7f*b+0x8449fb77);
        b ^=P(0x70d06e7f*a+0x8449fb77);
        a ^=P(0x70d06e7f*b+0x8449fb77);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>0)&15)+12)&15]<<0;
        tempData64^=((y>>0)&0xffff)<<40;
        y |=(u64) s[(((tempData64>>4)&15)-9)&15]<<4;
        c = (unsigned int)(tempData64>>8);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-115)&255];
        b=((3*((c>>8)&255)+211)&255)^a;
        b=S[(b-202)&255];
        a=((3*a+175)&255)^b;
        c = b<<8|a;
        d = ((3*d)+48547)^c;
        a=S[((d&255)-49)&255];
        b=((3*((d>>8)&255)+179)&255)^a;
        b=S[(b+126)&255];
        a=((3*a+111)&255)^b;
        d = b<<8|a;
        c = (((3*c)+28881)&65535)^d;
        y|=(u64)(d<<16|c)<<8;
        a=S[(((tempData64>>40)&255)-118)&255];
        b=((3*((tempData64>>48)&255)+251)&255)^a;
        b=S[(b+73)&255];
        a=((3*a+133)&255)^b;
        y |= (u64)(b<<8|a)<<40;
        y |=(u64) s[(((tempData64>>56)&15)-12)&15]<<56;
        y |=(u64) s[(((tempData64>>60)&15)+3)&15]<<60;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x448381ef*b+0x1ac06611);
        b ^=P(0x448381ef*a+0x1ac06611);
        a ^=P(0x448381ef*b+0x1ac06611);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>56)&15)-3)&15]<<56;
        tempData64^=((y>>56)&0xf)<<52;
        y |=(u64) s[(((tempData64>>60)&15)-1)&15]<<60;
        c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+126)&255];
        b=((3*((c>>8)&255)+111)&255)^a;
        b=S[(b+208)&255];
        a=((3*a+113)&255)^b;
        c = b<<8|a;
        d = ((3*d)+64375)^c;
        a=S[((d&255)+73)&255];
        b=((3*((d>>8)&255)+133)&255)^a;
        b=S[(b-236)&255];
        a=((3*a+129)&255)^b;
        d = b<<8|a;
        c = (((3*c)+17539)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64) s[(((tempData64>>32)&15)+1)&15]<<32;
        a=S[(((tempData64>>36)&255)+192)&255];
        b=((3*((tempData64>>44)&255)+27)&255)^a;
        b=S[(b+145)&255];
        a=((3*a+83)&255)^b;
        y |= (u64)(b<<8|a)<<36;
        y |=(u64) s[(((tempData64>>52)&15)-0)&15]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xb7405293*b+0xae0e971b);
        b ^=P(0xb7405293*a+0xae0e971b);
        a ^=P(0xb7405293*b+0xae0e971b);
        tempData64 = (u64)b<<32 | a;
        y=0;a=S[(((tempData64>>0)&255)-118)&255];
        b=((3*((tempData64>>8)&255)+251)&255)^a;
        b=S[(b+73)&255];
        a=((3*a+133)&255)^b;
        y |= (u64)(b<<8|a)<<0;
        c = (unsigned int)(tempData64>>16);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-236)&255];
        b=((3*((c>>8)&255)+129)&255)^a;
        b=S[(b+131)&255];
        a=((3*a+69)&255)^b;
        c = b<<8|a;
        d = ((3*d)+26129)^c;
        a=S[((d&255)+192)&255];
        b=((3*((d>>8)&255)+27)&255)^a;
        b=S[(b+145)&255];
        a=((3*a+83)&255)^b;
        d = b<<8|a;
        c = (((3*c)+46913)&65535)^d;
        y|=(u64)(d<<16|c)<<16;
        y |=(u64) S[(((tempData64>>48)&255)-26)&255]<<48;
        y |=(u64) S[(((tempData64>>56)&255)+14)&255]<<56;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x2c34e3d7*b+0xe9eafd41);
        b ^=P(0x2c34e3d7*a+0xe9eafd41);
        a ^=P(0x2c34e3d7*b+0xe9eafd41);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>52)&255)+17)&255]<<52;
        tempData64^=((y>>52)&0xf)<<60;
        y |=(u64) s[(((tempData64>>60)&15)+0)&15]<<60;
        y |=(u64) s[(((tempData64>>0)&15)+1)&15]<<0;
        c = (unsigned int)(tempData64>>4);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-64)&255];
        b=((3*((c>>8)&255)+183)&255)^a;
        b=S[(b-26)&255];
        a=((3*a+151)&255)^b;
        c = b<<8|a;
        d = ((3*d)+44559)^c;
        a=S[((d&255)-212)&255];
        b=((3*((d>>8)&255)+227)&255)^a;
        b=S[(b+52)&255];
        a=((3*a+45)&255)^b;
        d = b<<8|a;
        c = (((3*c)+64833)&65535)^d;
        y|=(u64)(d<<16|c)<<4;
        a=S[(((tempData64>>36)&255)-234)&255];
        b=((3*((tempData64>>44)&255)+233)&255)^a;
        b=S[(b-78)&255];
        a=((3*a+123)&255)^b;
        y |= (u64)(b<<8|a)<<36;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xf8187b4f*b+0xfa7e5f07);
        b ^=P(0xf8187b4f*a+0xfa7e5f07);
        a ^=P(0xf8187b4f*b+0xfa7e5f07);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>0)&255)-26)&255]<<0;
        y |=(u64) s[(((tempData64>>8)&15)+14)&15]<<8;
        y |=(u64) S[(((tempData64>>12)&255)-212)&255]<<12;
        a=S[(((tempData64>>20)&255)+52)&255];
        b=((3*((tempData64>>28)&255)+45)&255)^a;
        b=S[(b-65)&255];
        a=((3*a+253)&255)^b;
        y |= (u64)(b<<8|a)<<20;
        a=S[(((tempData64>>36)&255)-234)&255];
        b=((3*((tempData64>>44)&255)+233)&255)^a;
        b=S[(b-78)&255];
        a=((3*a+123)&255)^b;
        y |= (u64)(b<<8|a)<<36;
        y |=(u64) s[(((tempData64>>52)&15)+8)&15]<<52;
        y |=(u64) S[(((tempData64>>56)&255)-6)&255]<<56;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x81fd29ab*b+0x1bb396a3);
        b ^=P(0x81fd29ab*a+0x1bb396a3);
        a ^=P(0x81fd29ab*b+0x1bb396a3);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>52)&15)-1)&15]<<52;
        tempData64^=((y>>52)&0xf)<<56;
        y |=(u64) s[(((tempData64>>56)&15)-10)&15]<<56;
        y |=(u64) s[(((tempData64>>60)&15)-14)&15]<<60;
        y |=(u64) s[(((tempData64>>0)&15)+8)&15]<<0;
        y |=(u64) S[(((tempData64>>4)&255)-6)&255]<<4;
        y |=(u64) S[(((tempData64>>12)&255)+126)&255]<<12;
        c = (unsigned int)(tempData64>>20);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-168)&255];
        b=((3*((c>>8)&255)+41)&255)^a;
        b=S[(b-253)&255];
        a=((3*a+129)&255)^b;
        c = b<<8|a;
        d = ((3*d)+38563)^c;
        a=S[((d&255)-179)&255];
        b=((3*((d>>8)&255)+27)&255)^a;
        b=S[(b-247)&255];
        a=((3*a+203)&255)^b;
        d = b<<8|a;
        c = (((3*c)+38583)&65535)^d;
        y|=(u64)(d<<16|c)<<20;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x96b6cbf7*b+0x55e6c6db);
        b ^=P(0x96b6cbf7*a+0x55e6c6db);
        a ^=P(0x96b6cbf7*b+0x55e6c6db);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>52)&255)-6)&255]<<52;
        y |=(u64) s[(((tempData64>>60)&15)+14)&15]<<60;
        a=S[(((tempData64>>0)&255)-168)&255];
        b=((3*((tempData64>>8)&255)+41)&255)^a;
        b=S[(b-253)&255];
        a=((3*a+129)&255)^b;
        y |= (u64)(b<<8|a)<<0;
        c = (unsigned int)(tempData64>>16);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+163)&255];
        b=((3*((c>>8)&255)+151)&255)^a;
        b=S[(b-179)&255];
        a=((3*a+27)&255)^b;
        c = b<<8|a;
        d = ((3*d)+52215)^c;
        a=S[((d&255)+182)&255];
        b=((3*((d>>8)&255)+151)&255)^a;
        b=S[(b+219)&255];
        a=((3*a+199)&255)^b;
        d = b<<8|a;
        c = (((3*c)+21991)&65535)^d;
        y|=(u64)(d<<16|c)<<16;
        y |=(u64) s[(((tempData64>>48)&15)-11)&15]<<48;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xb948c9bb*b+0x4f2a245f);
        b ^=P(0xb948c9bb*a+0x4f2a245f);
        a ^=P(0xb948c9bb*b+0x4f2a245f);
        tempData64 = (u64)b<<32 | a;
        *(ciphertxt+block) = tempData64;
    }
    return block;
}


int decryptZTB(u64* ciphertxt, int clen, u64* plaintxt)
{
    static u8 s_1[16]={0x0,0x5,0x2,0x9,0x8,0xb,0x6,0xa,0x1,0x7,0xc,0xe,0x3,0xd,0xf,0x4};
    static u8 S_1[256]={0xb8,0x6d,0x6c,0x4a,0xe2,0x17,0xf1,0x22,0x0e,0x55,0x3b,0xcd,0xc7,0x5b,0x80,0xa2,
        0x66,0x7e,0x2d,0xc4,0xa1,0x7f,0x83,0xec,0x39,0x63,0xcf,0x6f,0x2a,0x86,0x87,0xb5,
        0xe6,0xa9,0xf9,0x64,0x7d,0x91,0xff,0x62,0x30,0x57,0x21,0xcb,0x04,0xd1,0xd6,0x36,
        0x12,0x44,0x33,0x8f,0x52,0x9f,0xc0,0xfc,0xef,0x95,0x41,0x88,0x89,0x0a,0xb6,0x7c,
        0xb1,0x84,0x4b,0xa0,0xb2,0xf0,0x48,0xdf,0x0c,0x73,0xc2,0xca,0x79,0xaf,0x2e,0xb4,
        0x8a,0x65,0xe4,0x8d,0x3f,0xee,0x34,0x8b,0xf3,0x0d,0x08,0x0f,0x9b,0x18,0x2b,0xbe,
        0x31,0xdc,0xaa,0xbd,0x4f,0x26,0xeb,0xb0,0xae,0x75,0xab,0x50,0x2c,0x58,0x1a,0x46,
        0x13,0xf6,0x40,0x27,0xe9,0xfa,0x69,0x5a,0xc8,0xcc,0x4c,0x37,0x01,0x38,0xe8,0xbf,
        0x77,0x8c,0x8e,0x43,0xc6,0x99,0x09,0x92,0x5f,0x20,0xd3,0x59,0x03,0xd5,0xd7,0x00,
        0x02,0xdb,0x4d,0xf2,0x42,0x32,0xd4,0x56,0x07,0x9d,0xce,0x93,0xe3,0xb3,0xb7,0x19,
        0xda,0xb9,0x90,0x15,0xc3,0xfd,0xea,0x98,0xd0,0x54,0xfb,0xbc,0xdd,0x6e,0x76,0x2f,
        0xad,0x1f,0xa7,0x67,0x28,0x24,0x81,0xa3,0x3e,0x25,0x68,0x23,0xc9,0x74,0x1b,0x6b,
        0xf7,0x5d,0xde,0x3a,0x10,0x5e,0xa5,0x9c,0x1c,0xd8,0xd9,0x1e,0xbb,0x7b,0x45,0xe1,
        0x47,0x53,0x71,0x78,0x70,0x82,0x05,0xed,0xba,0xa8,0x35,0xd2,0xac,0xc1,0xa4,0x3c,
        0x06,0x72,0x3d,0xf4,0x9e,0x14,0xfe,0x1d,0x29,0x16,0x94,0x49,0x60,0x5c,0xc5,0x61,
        0xe5,0x7a,0xe7,0xe0,0xf5,0xa6,0x97,0x0b,0x51,0x11,0x6a,0x4e,0x85,0x96,0x9a,0xf8};
    u32 a,b,c,d;
    u64 tempData64,y=0;
    int block;
    
    for(block=0;block<clen;block++)
    {
        tempData64=*(ciphertxt+block);
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x9574a85f*b+0x2f3fd929);
        b ^=P(0x9574a85f*a+0x2f3fd929);
        a ^=P(0x9574a85f*b+0x2f3fd929);
        tempData64 = (u64)b<<32 | a;
        y=0;a=(171*((tempData64>>0 ^ tempData64>>8)-219))&255;
        //62
        b=(S_1[(tempData64>>8)&255]-54)&255;
        b=(171*((b ^a)-41))&255;
        a=(S_1[a]-118)&255;
        y |= (u64)(b<<8|a)<<0;
        y |=(u64)(( s_1[(tempData64>>16)&15]-11)&15)<<16;
        y |=(u64)(( S_1[(tempData64>>20)&255]+189)&255)<<20;
        a=(171*((tempData64>>28 ^ tempData64>>36)-179))&255;
        //66
        b=(S_1[(tempData64>>36)&255]+159)&255;
        b=(171*((b ^a)-25))&255;
        a=(S_1[a]+24)&255;
        y |= (u64)(b<<8|a)<<28;
        a=(171*((tempData64>>44 ^ tempData64>>52)-49))&255;
        //68
        b=(S_1[(tempData64>>52)&255]+226)&255;
        b=(171*((b ^a)-5))&255;
        a=(S_1[a]-253)&255;
        y |= (u64)(b<<8|a)<<44;
        y |=(u64)(( s_1[(tempData64>>60)&15]-5)&15)<<60;
        y=y^((tempData64>>0)&0xf&0xffff)<<16;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x31e204ff*b+0x9ae63275);
        b ^=P(0x31e204ff*a+0x9ae63275);
        a ^=P(0x31e204ff*b+0x9ae63275);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>60)&15]-5)&15)<<60;
        a=(171*((tempData64>>0 ^ tempData64>>8)-67))&255;
        //59
        b=(S_1[(tempData64>>8)&255]-146)&255;
        b=(171*((b ^a)-135))&255;
        a=(S_1[a]-242)&255;
        y |= (u64)(b<<8|a)<<0;
        c=(43691*((tempData64>>16 ^ tempData64>>32)-6425))&65535;
        a=(171*((tempData64>>32 ^ tempData64>>40)-127))&255;
        b=(S_1[(tempData64>>40)&255]+189)&255;
        b=(171*((b ^a)-31))&255;
        a=(S_1[a]-139)&255;
        d=b<<8|a;
        d=(43691*((c^d)-55863))&65535;
        a=(171*((c>>8 ^ c)-41))&255;
        b=(S_1[(c>>8)&255]-118)&255;
        b=(171*((b ^a)-225))&255;
        a=(S_1[a]+86)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<16;
        y |=(u64)(( s_1[(tempData64>>48)&15]+15)&15)<<48;
        y |=(u64)(( S_1[(tempData64>>52)&255]-253)&255)<<52;
        y=y^((tempData64>>60)&0xffffffff&0xf)<<16;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x7fbd1e8b*b+0xb39f1919);
        b ^=P(0x7fbd1e8b*a+0xb39f1919);
        a ^=P(0x7fbd1e8b*b+0xb39f1919);
        tempData64 = (u64)b<<32 | a;
        y=0;c=(43691*((tempData64>>8 ^ tempData64>>24)-34547))&65535;
        a=(171*((tempData64>>24 ^ tempData64>>32)-35))&255;
        b=(S_1[(tempData64>>32)&255]-213)&255;
        b=(171*((b ^a)-171))&255;
        a=(S_1[a]+222)&255;
        d=b<<8|a;
        d=(43691*((c^d)-63807))&65535;
        a=(171*((c>>8 ^ c)-155))&255;
        b=(S_1[(c>>8)&255]+138)&255;
        b=(171*((b ^a)-215))&255;
        a=(S_1[a]-138)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<8;
        a=(171*((tempData64>>40 ^ tempData64>>48)-225))&255;
        //60
        b=(S_1[(tempData64>>48)&255]+86)&255;
        b=(171*((b ^a)-67))&255;
        a=(S_1[a]-146)&255;
        y |= (u64)(b<<8|a)<<40;
        y |=(u64)(( s_1[(tempData64>>56)&15]-6)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-6)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]-139)&255)<<0;
        y=y^((tempData64>>8)&0xf&0xffffffff)<<60;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xe1564293*b+0xda362877);
        b ^=P(0xe1564293*a+0xda362877);
        a ^=P(0xe1564293*b+0xda362877);
        tempData64 = (u64)b<<32 | a;
        y=0;a=(171*((tempData64>>44 ^ tempData64>>52)-85))&255;
        //50
        b=(S_1[(tempData64>>52)&255]+244)&255;
        b=(171*((b ^a)-249))&255;
        a=(S_1[a]+95)&255;
        y |= (u64)(b<<8|a)<<44;
        y |=(u64)(( s_1[(tempData64>>60)&15]-13)&15)<<60;
        c=(43691*((tempData64>>0 ^ tempData64>>16)-8917))&65535;
        a=(171*((tempData64>>16 ^ tempData64>>24)-171))&255;
        b=(S_1[(tempData64>>24)&255]+222)&255;
        b=(171*((b ^a)-249))&255;
        a=(S_1[a]+62)&255;
        d=b<<8|a;
        d=(43691*((c^d)-39819))&65535;
        a=(171*((c>>8 ^ c)-215))&255;
        b=(S_1[(c>>8)&255]-138)&255;
        b=(171*((b ^a)-153))&255;
        a=(S_1[a]+11)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64)(( S_1[(tempData64>>32)&255]-242)&255)<<32;
        y |=(u64)(( s_1[(tempData64>>40)&15]-2)&15)<<40;
        y=y^((tempData64>>44)&0xff&0xffff)<<32;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xabdef93f*b+0x86f222d5);
        b ^=P(0xabdef93f*a+0x86f222d5);
        a ^=P(0xabdef93f*b+0x86f222d5);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( S_1[(tempData64>>36)&255]-91)&255)<<36;
        y |=(u64)(( s_1[(tempData64>>44)&15]+0)&15)<<44;
        y |=(u64)(( s_1[(tempData64>>48)&15]-15)&15)<<48;
        y |=(u64)(( s_1[(tempData64>>52)&15]-3)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]+15)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+4)&15)<<60;
        a=(171*((tempData64>>0 ^ tempData64>>8)-153))&255;
        //52
        b=(S_1[(tempData64>>8)&255]+11)&255;
        b=(171*((b ^a)-191))&255;
        a=(S_1[a]-173)&255;
        y |= (u64)(b<<8|a)<<0;
        y |=(u64)(( S_1[(tempData64>>16)&255]-138)&255)<<16;
        y |=(u64)(( s_1[(tempData64>>24)&15]+10)&15)<<24;
        y |=(u64)(( S_1[(tempData64>>28)&255]+62)&255)<<28;
        y=y^((tempData64>>36)&0xf&0xff)<<44;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x990bbeaf*b+0x9b8ad68b);
        b ^=P(0x990bbeaf*a+0x9b8ad68b);
        a ^=P(0x990bbeaf*b+0x9b8ad68b);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>56)&15]+11)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-10)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]+70)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]+238)&255)<<8;
        y |=(u64)(( s_1[(tempData64>>16)&15]-11)&15)<<16;
        y |=(u64)(( s_1[(tempData64>>20)&15]+0)&15)<<20;
        c=(43691*((tempData64>>24 ^ tempData64>>40)-39179))&65535;
        a=(171*((tempData64>>40 ^ tempData64>>48)-191))&255;
        b=(S_1[(tempData64>>48)&255]-173)&255;
        b=(171*((b ^a)-85))&255;
        a=(S_1[a]+244)&255;
        d=b<<8|a;
        d=(43691*((c^d)-63839))&65535;
        a=(171*((c>>8 ^ c)-151))&255;
        b=(S_1[(c>>8)&255]-179)&255;
        b=(171*((b ^a)-193))&255;
        a=(S_1[a]-111)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<24;
        y=y^((tempData64>>56)&0xf&0xf)<<16;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x96b3c06f*b+0x55f4f95f);
        b ^=P(0x96b3c06f*a+0x55f4f95f);
        a ^=P(0x96b3c06f*b+0x55f4f95f);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>52)&15]-13)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]+2)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+5)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]+28)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]+235)&255)<<8;
        a=(171*((tempData64>>16 ^ tempData64>>24)-155))&255;
        //43
        b=(S_1[(tempData64>>24)&255]+70)&255;
        b=(171*((b ^a)-237))&255;
        a=(S_1[a]-106)&255;
        y |= (u64)(b<<8|a)<<16;
        a=(171*((tempData64>>32 ^ tempData64>>40)-47))&255;
        //45
        b=(S_1[(tempData64>>40)&255]-91)&255;
        b=(171*((b ^a)-197))&255;
        a=(S_1[a]+238)&255;
        y |= (u64)(b<<8|a)<<32;
        y |=(u64)(( s_1[(tempData64>>48)&15]+0)&15)<<48;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xc5ee9b47*b+0xb1e02e5b);
        b ^=P(0xc5ee9b47*a+0xb1e02e5b);
        a ^=P(0xc5ee9b47*b+0xb1e02e5b);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>16)&15]-3)&15)<<16;
        a=(171*((tempData64>>20 ^ tempData64>>28)-211))&255;
        //35
        b=(S_1[(tempData64>>28)&255]+165)&255;
        b=(171*((b ^a)-169))&255;
        a=(S_1[a]+79)&255;
        y |= (u64)(b<<8|a)<<20;
        a=(171*((tempData64>>36 ^ tempData64>>44)-185))&255;
        //37
        b=(S_1[(tempData64>>44)&255]-77)&255;
        b=(171*((b ^a)-149))&255;
        a=(S_1[a]+85)&255;
        y |= (u64)(b<<8|a)<<36;
        y |=(u64)(( s_1[(tempData64>>52)&15]+2)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]+5)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+12)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]+235)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]-106)&255)<<8;
        y=y^((tempData64>>16)&0xf&0xf)<<56;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xd91c5307*b+0xec6a85eb);
        b ^=P(0xd91c5307*a+0xec6a85eb);
        a ^=P(0xd91c5307*b+0xec6a85eb);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>56)&15]-0)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-10)&15)<<60;
        c=(43691*((tempData64>>0 ^ tempData64>>16)-38229))&65535;
        a=(171*((tempData64>>16 ^ tempData64>>24)-211))&255;
        b=(S_1[(tempData64>>24)&255]+165)&255;
        b=(171*((b ^a)-169))&255;
        a=(S_1[a]+79)&255;
        d=b<<8|a;
        d=(43691*((c^d)-50771))&65535;
        a=(171*((c>>8 ^ c)-151))&255;
        b=(S_1[(c>>8)&255]-2)&255;
        b=(171*((b ^a)-175))&255;
        a=(S_1[a]+133)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64)(( S_1[(tempData64>>32)&255]-77)&255)<<32;
        a=(171*((tempData64>>40 ^ tempData64>>48)-83))&255;
        //39
        b=(S_1[(tempData64>>48)&255]+5)&255;
        b=(171*((b ^a)-105))&255;
        a=(S_1[a]+50)&255;
        y |= (u64)(b<<8|a)<<40;
        y=y^((tempData64>>56)&0xffff&0xf)<<40;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x9555d3a7*b+0x6932b84d);
        b ^=P(0x9555d3a7*a+0x6932b84d);
        a ^=P(0x9555d3a7*b+0x6932b84d);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>0)&15]+4)&15)<<0;
        c=(43691*((tempData64>>4 ^ tempData64>>20)-44933))&65535;
        a=(171*((tempData64>>20 ^ tempData64>>28)-139))&255;
        b=(S_1[(tempData64>>28)&255]-10)&255;
        b=(171*((b ^a)-209))&255;
        a=(S_1[a]-208)&255;
        d=b<<8|a;
        d=(43691*((c^d)-10201))&65535;
        a=(171*((c>>8 ^ c)-107))&255;
        b=(S_1[(c>>8)&255]+143)&255;
        b=(171*((b ^a)-71))&255;
        a=(S_1[a]+197)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<4;
        y |=(u64)(( S_1[(tempData64>>36)&255]-2)&255)<<36;
        y |=(u64)(( S_1[(tempData64>>44)&255]-83)&255)<<44;
        y |=(u64)(( S_1[(tempData64>>52)&255]+79)&255)<<52;
        y |=(u64)(( s_1[(tempData64>>60)&15]+5)&15)<<60;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x9602af87*b+0xa94fc653);
        b ^=P(0x9602af87*a+0xa94fc653);
        a ^=P(0x9602af87*b+0xa94fc653);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( S_1[(tempData64>>48)&255]+20)&255)<<48;
        y |=(u64)(( s_1[(tempData64>>56)&15]-3)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+12)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]-220)&255)<<0;
        c=(43691*((tempData64>>8 ^ tempData64>>24)-35339))&65535;
        a=(171*((tempData64>>24 ^ tempData64>>32)-209))&255;
        b=(S_1[(tempData64>>32)&255]-208)&255;
        b=(171*((b ^a)-39))&255;
        a=(S_1[a]+216)&255;
        d=b<<8|a;
        d=(43691*((c^d)-27535))&65535;
        a=(171*((c>>8 ^ c)-71))&255;
        b=(S_1[(c>>8)&255]+197)&255;
        b=(171*((b ^a)-5))&255;
        a=(S_1[a]+52)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<8;
        y |=(u64)(( s_1[(tempData64>>40)&15]+5)&15)<<40;
        y |=(u64)(( s_1[(tempData64>>44)&15]-2)&15)<<44;
        y=y^((tempData64>>48)&0xff&0xff)<<0;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x27d86b8f*b+0x8a0ad0d1);
        b ^=P(0x27d86b8f*a+0x8a0ad0d1);
        a ^=P(0x27d86b8f*b+0x8a0ad0d1);
        tempData64 = (u64)b<<32 | a;
        y=0;c=(43691*((tempData64>>20 ^ tempData64>>36)-39427))&65535;
        a=(171*((tempData64>>36 ^ tempData64>>44)-95))&255;
        b=(S_1[(tempData64>>44)&255]+20)&255;
        b=(171*((b ^a)-183))&255;
        a=(S_1[a]+59)&255;
        d=b<<8|a;
        d=(43691*((c^d)-32269))&65535;
        a=(171*((c>>8 ^ c)-141))&255;
        b=(S_1[(c>>8)&255]-145)&255;
        b=(171*((b ^a)-195))&255;
        a=(S_1[a]-182)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<20;
        y |=(u64)(( s_1[(tempData64>>52)&15]+12)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]-12)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+4)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]+197)&255)<<0;
        y |=(u64)(( s_1[(tempData64>>8)&15]+15)&15)<<8;
        y |=(u64)(( S_1[(tempData64>>12)&255]+216)&255)<<12;
        y=y^((tempData64>>20)&0xf&0xffffffff)<<8;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xa6dcd75f*b+0x47c50535);
        b ^=P(0xa6dcd75f*a+0x47c50535);
        a ^=P(0xa6dcd75f*b+0x47c50535);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>36)&15]-0)&15)<<36;
        y |=(u64)(( S_1[(tempData64>>40)&255]-171)&255)<<40;
        y |=(u64)(( S_1[(tempData64>>48)&255]-209)&255)<<48;
        y |=(u64)(( s_1[(tempData64>>56)&15]-10)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-6)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]-145)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]-13)&255)<<8;
        y |=(u64)(( s_1[(tempData64>>16)&15]+11)&15)<<16;
        a=(171*((tempData64>>20 ^ tempData64>>28)-155))&255;
        //22
        b=(S_1[(tempData64>>28)&255]-3)&255;
        b=(171*((b ^a)-95))&255;
        a=(S_1[a]+20)&255;
        y |= (u64)(b<<8|a)<<20;
        y=y^((tempData64>>36)&0xffff&0xf)<<20;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xb73b7e0f*b+0x9a035f15);
        b ^=P(0xb73b7e0f*a+0x9a035f15);
        a ^=P(0xb73b7e0f*b+0x9a035f15);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>0)&15]-0)&15)<<0;
        y |=(u64)(( s_1[(tempData64>>4)&15]+2)&15)<<4;
        y |=(u64)(( S_1[(tempData64>>8)&255]-133)&255)<<8;
        y |=(u64)(( s_1[(tempData64>>16)&15]-13)&15)<<16;
        y |=(u64)(( s_1[(tempData64>>20)&15]-0)&15)<<20;
        c=(43691*((tempData64>>24 ^ tempData64>>40)-32269))&65535;
        a=(171*((tempData64>>40 ^ tempData64>>48)-141))&255;
        b=(S_1[(tempData64>>48)&255]-145)&255;
        b=(171*((b ^a)-195))&255;
        a=(S_1[a]-182)&255;
        d=b<<8|a;
        d=(43691*((c^d)-55339))&65535;
        a=(171*((c>>8 ^ c)-49))&255;
        b=(S_1[(c>>8)&255]-209)&255;
        b=(171*((b ^a)-67))&255;
        a=(S_1[a]-171)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<24;
        y |=(u64)(( s_1[(tempData64>>56)&15]+11)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+4)&15)<<60;
        y=y^((tempData64>>0)&0xf&0xf)<<16;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xd82a30d3*b+0x8c91c2b7);
        b ^=P(0xd82a30d3*a+0x8c91c2b7);
        a ^=P(0xd82a30d3*b+0x8c91c2b7);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>40)&15]+15)&15)<<40;
        y |=(u64)(( s_1[(tempData64>>44)&15]+10)&15)<<44;
        y |=(u64)(( S_1[(tempData64>>48)&255]-16)&255)<<48;
        y |=(u64)(( S_1[(tempData64>>56)&255]+64)&255)<<56;
        a=(171*((tempData64>>0 ^ tempData64>>8)-191))&255;
        //10
        b=(S_1[(tempData64>>8)&255]+66)&255;
        b=(171*((b ^a)-95))&255;
        a=(S_1[a]-64)&255;
        y |= (u64)(b<<8|a)<<0;
        a=(171*((tempData64>>16 ^ tempData64>>24)-205))&255;
        //12
        b=(S_1[(tempData64>>24)&255]-61)&255;
        b=(171*((b ^a)-85))&255;
        a=(S_1[a]-133)&255;
        y |= (u64)(b<<8|a)<<16;
        y |=(u64)(( S_1[(tempData64>>32)&255]-16)&255)<<32;
        y=y^((tempData64>>40)&0xff&0xf)<<32;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xcc3d5487*b+0x42ab9a11);
        b ^=P(0xcc3d5487*a+0x42ab9a11);
        a ^=P(0xcc3d5487*b+0x42ab9a11);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>52)&15]+5)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]+3)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-10)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]-90)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]+63)&255)<<8;
        a=(171*((tempData64>>16 ^ tempData64>>24)-61))&255;
        //7
        b=(S_1[(tempData64>>24)&255]-16)&255;
        b=(171*((b ^a)-135))&255;
        a=(S_1[a]+106)&255;
        y |= (u64)(b<<8|a)<<16;
        y |=(u64)(( s_1[(tempData64>>32)&15]+0)&15)<<32;
        a=(171*((tempData64>>36 ^ tempData64>>44)-191))&255;
        //10
        b=(S_1[(tempData64>>44)&255]+66)&255;
        b=(171*((b ^a)-95))&255;
        a=(S_1[a]-64)&255;
        y |= (u64)(b<<8|a)<<36;
        y=y^((tempData64>>52)&0xff&0xf)<<0;
        tempData64=y;
        *(plaintxt+block) = tempData64;
    }
    return block;
}


int encryptZUA(u64* plaintxt, int plen, u64* ciphertxt)
{
    static u8 s[16]={0x9,0xd,0x7,0x6,0xa,0xf,0x1,0x3,0xe,0x2,0x4,0x8,0xc,0x0,0xb,0x5};
    static u8 S[256]={0x43,0xda,0xd3,0xc5,0xeb,0xfc,0x96,0xa8,0xc6,0x71,0xae,0x74,0xde,0x16,0x03,0x24,
        0x8b,0x9a,0x80,0x92,0xa5,0xb6,0x90,0xba,0xc0,0xbd,0xa4,0x48,0x72,0x84,0x6c,0x2c,
        0xad,0x37,0xee,0x44,0x1f,0xb2,0xfd,0xdd,0x65,0xa0,0xf1,0x13,0xea,0xd0,0x45,0xf9,
        0xd9,0xe7,0xc1,0xc9,0x33,0x26,0x51,0x53,0x62,0x8f,0xcb,0x27,0x5b,0x4f,0x0f,0xa9,
        0x5c,0x42,0x1a,0x09,0x57,0xab,0x79,0x7c,0xce,0x75,0xe6,0x23,0x19,0x25,0xd4,0x17,
        0x60,0x70,0xfb,0x86,0xb4,0x32,0x88,0xd7,0x7a,0x8c,0x82,0xb1,0x52,0x8d,0x1c,0xa1,
        0xc2,0x08,0x77,0x12,0x39,0x5e,0x83,0x41,0xb8,0xc7,0x2a,0x15,0xcc,0x9b,0xff,0xe9,
        0x91,0xac,0x66,0x85,0x6f,0xb3,0xd2,0xb9,0xca,0x2b,0xdf,0xaf,0x1b,0x46,0xbf,0xed,
        0x55,0x9f,0x0b,0x97,0xd5,0xc4,0x8a,0xa2,0xd1,0x94,0x95,0x8e,0xd6,0xf6,0x40,0x7f,
        0x3a,0xbe,0xf8,0xfa,0x04,0x59,0x3d,0xf0,0x0a,0x9d,0x61,0x11,0xbc,0x07,0xd8,0x47,
        0x93,0xdb,0x1e,0xec,0x3f,0xf4,0xbb,0x3e,0x05,0x58,0xcd,0xaa,0x06,0xe8,0xc3,0xe4,
        0x73,0x35,0x98,0x4d,0x4e,0x87,0x63,0x64,0x0c,0x02,0xef,0x67,0x0d,0x28,0xf3,0x68,
        0x10,0x7d,0x69,0x6a,0x89,0x01,0x4a,0x0e,0x6d,0x6e,0x30,0x4b,0xe3,0x38,0x36,0xe0,
        0x21,0x78,0x2f,0x14,0xc8,0x6b,0xe2,0xcf,0x9e,0xe5,0x1d,0xf2,0x9c,0x50,0x7e,0x3b,
        0xfe,0x54,0x5a,0xf5,0x5d,0x29,0x4c,0xb0,0x3c,0x2d,0xa3,0xdc,0xf7,0x5f,0xe1,0x76,
        0x99,0x49,0x22,0x20,0x7b,0x81,0xb7,0x00,0xb5,0x31,0xa6,0x34,0x2e,0x18,0xa7,0x56};
    u32 a,b,c,d;
    u64 tempData64,y=0;
    int block;
    
    for(block=0;block<plen;block++)
    {
        tempData64=*(plaintxt+block);
        y=0;y |=(u64) S[(((tempData64>>56)&255)+111)&255]<<56;
        tempData64^=((y>>56)&0xff)<<0;
        y |=(u64) S[(((tempData64>>0)&255)-254)&255]<<0;
        y |=(u64) s[(((tempData64>>8)&15)+1)&15]<<8;
        y |=(u64) s[(((tempData64>>12)&15)-6)&15]<<12;
        y |=(u64) s[(((tempData64>>16)&15)-15)&15]<<16;
        c = (unsigned int)(tempData64>>20);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-66)&255];
        b=((3*((c>>8)&255)+251)&255)^a;
        b=S[(b+74)&255];
        a=((3*a+43)&255)^b;
        c = b<<8|a;
        d = ((3*d)+28051)^c;
        a=S[((d&255)+255)&255];
        b=((3*((d>>8)&255)+249)&255)^a;
        b=S[(b-142)&255];
        a=((3*a+25)&255)^b;
        d = b<<8|a;
        c = (((3*c)+13163)&65535)^d;
        y|=(u64)(d<<16|c)<<20;
        y |=(u64) s[(((tempData64>>52)&15)+7)&15]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x3cd7336b*b+0x891c6671);
        b ^=P(0x3cd7336b*a+0x891c6671);
        a ^=P(0x3cd7336b*b+0x891c6671);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>60)&15)-15)&15]<<60;
        tempData64^=((y>>60)&0xff)<<0;
        y |=(u64) S[(((tempData64>>0)&255)-66)&255]<<0;
        y |=(u64) s[(((tempData64>>8)&15)+10)&15]<<8;
        c = (unsigned int)(tempData64>>12);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-147)&255];
        b=((3*((c>>8)&255)+109)&255)^a;
        b=S[(b+255)&255];
        a=((3*a+249)&255)^b;
        c = b<<8|a;
        d = ((3*d)+6543)^c;
        a=S[((d&255)-107)&255];
        b=((3*((d>>8)&255)+51)&255)^a;
        b=S[(b+215)&255];
        a=((3*a+61)&255)^b;
        d = b<<8|a;
        c = (((3*c)+26225)&65535)^d;
        y|=(u64)(d<<16|c)<<12;
        y |=(u64) s[(((tempData64>>44)&15)-12)&15]<<44;
        y |=(u64) s[(((tempData64>>48)&15)-12)&15]<<48;
        y |=(u64) S[(((tempData64>>52)&255)-132)&255]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xff84df2f*b+0xcbb5cc39);
        b ^=P(0xff84df2f*a+0xcbb5cc39);
        a ^=P(0xff84df2f*b+0xcbb5cc39);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>36)&255)+255)&255]<<36;
        tempData64^=((y>>36)&0xffff)<<16;
        a=S[(((tempData64>>44)&255)-142)&255];
        b=((3*((tempData64>>52)&255)+25)&255)^a;
        b=S[(b-107)&255];
        a=((3*a+51)&255)^b;
        y |= (u64)(b<<8|a)<<44;
        y |=(u64) s[(((tempData64>>60)&15)+7)&15]<<60;
        a=S[(((tempData64>>0)&255)+112)&255];
        b=((3*((tempData64>>8)&255)+103)&255)^a;
        b=S[(b-28)&255];
        a=((3*a+137)&255)^b;
        y |= (u64)(b<<8|a)<<0;
        a=S[(((tempData64>>16)&255)-44)&255];
        b=((3*((tempData64>>24)&255)+223)&255)^a;
        b=S[(b-132)&255];
        a=((3*a+255)&255)^b;
        y |= (u64)(b<<8|a)<<16;
        y |=(u64) s[(((tempData64>>32)&15)+8)&15]<<32;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x5d7da813*b+0xf970c717);
        b ^=P(0x5d7da813*a+0xf970c717);
        a ^=P(0x5d7da813*b+0xf970c717);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>48)&15)+0)&15]<<48;
        y |=(u64) s[(((tempData64>>52)&15)-12)&15]<<52;
        y |=(u64) S[(((tempData64>>56)&255)-44)&255]<<56;
        c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-132)&255];
        b=((3*((c>>8)&255)+255)&255)^a;
        b=S[(b+56)&255];
        a=((3*a+205)&255)^b;
        c = b<<8|a;
        d = ((3*d)+52149)^c;
        a=S[((d&255)+19)&255];
        b=((3*((d>>8)&255)+169)&255)^a;
        b=S[(b-125)&255];
        a=((3*a+93)&255)^b;
        d = b<<8|a;
        c = (((3*c)+50967)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        a=S[(((tempData64>>32)&255)-112)&255];
        b=((3*((tempData64>>40)&255)+249)&255)^a;
        b=S[(b-17)&255];
        a=((3*a+127)&255)^b;
        y |= (u64)(b<<8|a)<<32;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xfdff7f13*b+0xf2af3111);
        b ^=P(0xfdff7f13*a+0xf2af3111);
        a ^=P(0xfdff7f13*b+0xf2af3111);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>56)&255)+56)&255]<<56;
        tempData64^=((y>>56)&0xf)<<0;
        y |=(u64) s[(((tempData64>>0)&15)-5)&15]<<0;
        c = (unsigned int)(tempData64>>4);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+19)&255];
        b=((3*((c>>8)&255)+169)&255)^a;
        b=S[(b-125)&255];
        a=((3*a+93)&255)^b;
        c = b<<8|a;
        d = ((3*d)+50967)^c;
        a=S[((d&255)-112)&255];
        b=((3*((d>>8)&255)+249)&255)^a;
        b=S[(b-17)&255];
        a=((3*a+127)&255)^b;
        d = b<<8|a;
        c = (((3*c)+65023)&65535)^d;
        y|=(u64)(d<<16|c)<<4;
        a=S[(((tempData64>>36)&255)-17)&255];
        b=((3*((tempData64>>44)&255)+49)&255)^a;
        b=S[(b+175)&255];
        a=((3*a+243)&255)^b;
        y |= (u64)(b<<8|a)<<36;
        y |=(u64) s[(((tempData64>>52)&15)-3)&15]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xcefe8943*b+0xeaef863f);
        b ^=P(0xcefe8943*a+0xeaef863f);
        a ^=P(0xcefe8943*b+0xeaef863f);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>56)&255)-22)&255]<<56;
        c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-112)&255];
        b=((3*((c>>8)&255)+249)&255)^a;
        b=S[(b-17)&255];
        a=((3*a+127)&255)^b;
        c = b<<8|a;
        d = ((3*d)+65023)^c;
        a=S[((d&255)-17)&255];
        b=((3*((d>>8)&255)+49)&255)^a;
        b=S[(b+175)&255];
        a=((3*a+243)&255)^b;
        d = b<<8|a;
        c = (((3*c)+35139)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64) s[(((tempData64>>32)&15)+14)&15]<<32;
        y |=(u64) S[(((tempData64>>36)&255)+63)&255]<<36;
        y |=(u64) s[(((tempData64>>44)&15)+15)&15]<<44;
        y |=(u64) s[(((tempData64>>48)&15)-11)&15]<<48;
        y |=(u64) s[(((tempData64>>52)&15)-5)&15]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x1d8587bb*b+0xf4126537);
        b ^=P(0x1d8587bb*a+0xf4126537);
        a ^=P(0x1d8587bb*b+0xf4126537);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>20)&15)-1)&15]<<20;
        tempData64^=((y>>20)&0xf)<<8;
        c = (unsigned int)(tempData64>>24);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+175)&255];
        b=((3*((c>>8)&255)+243)&255)^a;
        b=S[(b-67)&255];
        a=((3*a+137)&255)^b;
        c = b<<8|a;
        d = ((3*d)+52991)^c;
        a=S[((d&255)+63)&255];
        b=((3*((d>>8)&255)+135)&255)^a;
        b=S[(b+239)&255];
        a=((3*a+235)&255)^b;
        d = b<<8|a;
        c = (((3*c)+34747)&65535)^d;
        y|=(u64)(d<<16|c)<<24;
        y |=(u64) S[(((tempData64>>56)&255)-133)&255]<<56;
        y |=(u64) S[(((tempData64>>0)&255)-55)&255]<<0;
        y |=(u64) s[(((tempData64>>8)&15)+2)&15]<<8;
        y |=(u64) S[(((tempData64>>12)&255)-240)&255]<<12;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x8946bbf3*b+0xa569b02d);
        b ^=P(0x8946bbf3*a+0xa569b02d);
        a ^=P(0x8946bbf3*b+0xa569b02d);
        tempData64 = (u64)b<<32 | a;
        y=0;c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+63)&255];
        b=((3*((c>>8)&255)+135)&255)^a;
        b=S[(b+239)&255];
        a=((3*a+235)&255)^b;
        c = b<<8|a;
        d = ((3*d)+34747)^c;
        a=S[((d&255)-133)&255];
        b=((3*((d>>8)&255)+29)&255)^a;
        b=S[(b-55)&255];
        a=((3*a+101)&255)^b;
        d = b<<8|a;
        c = (((3*c)+62483)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64) s[(((tempData64>>32)&15)-0)&15]<<32;
        y |=(u64) s[(((tempData64>>36)&15)-6)&15]<<36;
        y |=(u64) S[(((tempData64>>40)&255)+44)&255]<<40;
        y |=(u64) S[(((tempData64>>48)&255)-105)&255]<<48;
        y |=(u64) s[(((tempData64>>56)&15)-3)&15]<<56;
        y |=(u64) s[(((tempData64>>60)&15)-10)&15]<<60;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xafcad373*b+0xb331bda3);
        b ^=P(0xafcad373*a+0xb331bda3);
        a ^=P(0xafcad373*b+0xb331bda3);
        tempData64 = (u64)b<<32 | a;
        y=0;c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-55)&255];
        b=((3*((c>>8)&255)+101)&255)^a;
        b=S[(b+18)&255];
        a=((3*a+245)&255)^b;
        c = b<<8|a;
        d = ((3*d)+48113)^c;
        a=S[((d&255)-70)&255];
        b=((3*((d>>8)&255)+137)&255)^a;
        b=S[(b+44)&255];
        a=((3*a+177)&255)^b;
        d = b<<8|a;
        c = (((3*c)+42345)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        tempData64^=((y>>0)&0xf)<<56;
        a=S[(((tempData64>>32)&255)-115)&255];
        b=((3*((tempData64>>40)&255)+211)&255)^a;
        b=S[(b-202)&255];
        a=((3*a+175)&255)^b;
        y |= (u64)(b<<8|a)<<32;
        y |=(u64) S[(((tempData64>>48)&255)-163)&255]<<48;
        y |=(u64) s[(((tempData64>>56)&15)-1)&15]<<56;
        y |=(u64) s[(((tempData64>>60)&15)+14)&15]<<60;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x70d06e7f*b+0x8449fb77);
        b ^=P(0x70d06e7f*a+0x8449fb77);
        a ^=P(0x70d06e7f*b+0x8449fb77);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>0)&15)+12)&15]<<0;
        tempData64^=((y>>0)&0xffff)<<40;
        y |=(u64) s[(((tempData64>>4)&15)-9)&15]<<4;
        c = (unsigned int)(tempData64>>8);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-115)&255];
        b=((3*((c>>8)&255)+211)&255)^a;
        b=S[(b-202)&255];
        a=((3*a+175)&255)^b;
        c = b<<8|a;
        d = ((3*d)+48547)^c;
        a=S[((d&255)-49)&255];
        b=((3*((d>>8)&255)+179)&255)^a;
        b=S[(b+126)&255];
        a=((3*a+111)&255)^b;
        d = b<<8|a;
        c = (((3*c)+28881)&65535)^d;
        y|=(u64)(d<<16|c)<<8;
        a=S[(((tempData64>>40)&255)-118)&255];
        b=((3*((tempData64>>48)&255)+251)&255)^a;
        b=S[(b+73)&255];
        a=((3*a+133)&255)^b;
        y |= (u64)(b<<8|a)<<40;
        y |=(u64) s[(((tempData64>>56)&15)-12)&15]<<56;
        y |=(u64) s[(((tempData64>>60)&15)+3)&15]<<60;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x448381ef*b+0x1ac06611);
        b ^=P(0x448381ef*a+0x1ac06611);
        a ^=P(0x448381ef*b+0x1ac06611);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>56)&15)-3)&15]<<56;
        tempData64^=((y>>56)&0xf)<<52;
        y |=(u64) s[(((tempData64>>60)&15)-1)&15]<<60;
        c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+126)&255];
        b=((3*((c>>8)&255)+111)&255)^a;
        b=S[(b+208)&255];
        a=((3*a+113)&255)^b;
        c = b<<8|a;
        d = ((3*d)+64375)^c;
        a=S[((d&255)+73)&255];
        b=((3*((d>>8)&255)+133)&255)^a;
        b=S[(b-236)&255];
        a=((3*a+129)&255)^b;
        d = b<<8|a;
        c = (((3*c)+17539)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64) s[(((tempData64>>32)&15)+1)&15]<<32;
        a=S[(((tempData64>>36)&255)+192)&255];
        b=((3*((tempData64>>44)&255)+27)&255)^a;
        b=S[(b+145)&255];
        a=((3*a+83)&255)^b;
        y |= (u64)(b<<8|a)<<36;
        y |=(u64) s[(((tempData64>>52)&15)-0)&15]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xb7405293*b+0xae0e971b);
        b ^=P(0xb7405293*a+0xae0e971b);
        a ^=P(0xb7405293*b+0xae0e971b);
        tempData64 = (u64)b<<32 | a;
        y=0;a=S[(((tempData64>>0)&255)-118)&255];
        b=((3*((tempData64>>8)&255)+251)&255)^a;
        b=S[(b+73)&255];
        a=((3*a+133)&255)^b;
        y |= (u64)(b<<8|a)<<0;
        c = (unsigned int)(tempData64>>16);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-236)&255];
        b=((3*((c>>8)&255)+129)&255)^a;
        b=S[(b+131)&255];
        a=((3*a+69)&255)^b;
        c = b<<8|a;
        d = ((3*d)+26129)^c;
        a=S[((d&255)+192)&255];
        b=((3*((d>>8)&255)+27)&255)^a;
        b=S[(b+145)&255];
        a=((3*a+83)&255)^b;
        d = b<<8|a;
        c = (((3*c)+46913)&65535)^d;
        y|=(u64)(d<<16|c)<<16;
        y |=(u64) S[(((tempData64>>48)&255)-26)&255]<<48;
        y |=(u64) S[(((tempData64>>56)&255)+14)&255]<<56;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x2c34e3d7*b+0xe9eafd41);
        b ^=P(0x2c34e3d7*a+0xe9eafd41);
        a ^=P(0x2c34e3d7*b+0xe9eafd41);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>52)&255)+17)&255]<<52;
        tempData64^=((y>>52)&0xf)<<60;
        y |=(u64) s[(((tempData64>>60)&15)+0)&15]<<60;
        y |=(u64) s[(((tempData64>>0)&15)+1)&15]<<0;
        c = (unsigned int)(tempData64>>4);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-64)&255];
        b=((3*((c>>8)&255)+183)&255)^a;
        b=S[(b-26)&255];
        a=((3*a+151)&255)^b;
        c = b<<8|a;
        d = ((3*d)+44559)^c;
        a=S[((d&255)-212)&255];
        b=((3*((d>>8)&255)+227)&255)^a;
        b=S[(b+52)&255];
        a=((3*a+45)&255)^b;
        d = b<<8|a;
        c = (((3*c)+64833)&65535)^d;
        y|=(u64)(d<<16|c)<<4;
        a=S[(((tempData64>>36)&255)-234)&255];
        b=((3*((tempData64>>44)&255)+233)&255)^a;
        b=S[(b-78)&255];
        a=((3*a+123)&255)^b;
        y |= (u64)(b<<8|a)<<36;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xf8187b4f*b+0xfa7e5f07);
        b ^=P(0xf8187b4f*a+0xfa7e5f07);
        a ^=P(0xf8187b4f*b+0xfa7e5f07);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>0)&255)-26)&255]<<0;
        y |=(u64) s[(((tempData64>>8)&15)+14)&15]<<8;
        y |=(u64) S[(((tempData64>>12)&255)-212)&255]<<12;
        a=S[(((tempData64>>20)&255)+52)&255];
        b=((3*((tempData64>>28)&255)+45)&255)^a;
        b=S[(b-65)&255];
        a=((3*a+253)&255)^b;
        y |= (u64)(b<<8|a)<<20;
        a=S[(((tempData64>>36)&255)-234)&255];
        b=((3*((tempData64>>44)&255)+233)&255)^a;
        b=S[(b-78)&255];
        a=((3*a+123)&255)^b;
        y |= (u64)(b<<8|a)<<36;
        y |=(u64) s[(((tempData64>>52)&15)+8)&15]<<52;
        y |=(u64) S[(((tempData64>>56)&255)-6)&255]<<56;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x81fd29ab*b+0x1bb396a3);
        b ^=P(0x81fd29ab*a+0x1bb396a3);
        a ^=P(0x81fd29ab*b+0x1bb396a3);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>52)&15)-1)&15]<<52;
        tempData64^=((y>>52)&0xf)<<56;
        y |=(u64) s[(((tempData64>>56)&15)-10)&15]<<56;
        y |=(u64) s[(((tempData64>>60)&15)-14)&15]<<60;
        y |=(u64) s[(((tempData64>>0)&15)+8)&15]<<0;
        y |=(u64) S[(((tempData64>>4)&255)-6)&255]<<4;
        y |=(u64) S[(((tempData64>>12)&255)+126)&255]<<12;
        c = (unsigned int)(tempData64>>20);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-168)&255];
        b=((3*((c>>8)&255)+41)&255)^a;
        b=S[(b-253)&255];
        a=((3*a+129)&255)^b;
        c = b<<8|a;
        d = ((3*d)+38563)^c;
        a=S[((d&255)-179)&255];
        b=((3*((d>>8)&255)+27)&255)^a;
        b=S[(b-247)&255];
        a=((3*a+203)&255)^b;
        d = b<<8|a;
        c = (((3*c)+38583)&65535)^d;
        y|=(u64)(d<<16|c)<<20;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x96b6cbf7*b+0x55e6c6db);
        b ^=P(0x96b6cbf7*a+0x55e6c6db);
        a ^=P(0x96b6cbf7*b+0x55e6c6db);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>52)&255)-6)&255]<<52;
        y |=(u64) s[(((tempData64>>60)&15)+14)&15]<<60;
        a=S[(((tempData64>>0)&255)-168)&255];
        b=((3*((tempData64>>8)&255)+41)&255)^a;
        b=S[(b-253)&255];
        a=((3*a+129)&255)^b;
        y |= (u64)(b<<8|a)<<0;
        c = (unsigned int)(tempData64>>16);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+163)&255];
        b=((3*((c>>8)&255)+151)&255)^a;
        b=S[(b-179)&255];
        a=((3*a+27)&255)^b;
        c = b<<8|a;
        d = ((3*d)+52215)^c;
        a=S[((d&255)+182)&255];
        b=((3*((d>>8)&255)+151)&255)^a;
        b=S[(b+219)&255];
        a=((3*a+199)&255)^b;
        d = b<<8|a;
        c = (((3*c)+21991)&65535)^d;
        y|=(u64)(d<<16|c)<<16;
        y |=(u64) s[(((tempData64>>48)&15)-11)&15]<<48;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xb948c9bb*b+0x4f2a245f);
        b ^=P(0xb948c9bb*a+0x4f2a245f);
        a ^=P(0xb948c9bb*b+0x4f2a245f);
        tempData64 = (u64)b<<32 | a;
        *(ciphertxt+block) = tempData64;
    }
    return block;
}


int decryptZUB(u64* ciphertxt, int clen, u64* plaintxt)
{
    static u8 s_1[16]={0x0,0x5,0x2,0x9,0x8,0xb,0x6,0xa,0x1,0x7,0xc,0xe,0x3,0xd,0xf,0x4};
    static u8 S_1[256]={0xb8,0x6d,0x6c,0x4a,0xe2,0x17,0xf1,0x22,0x0e,0x55,0x3b,0xcd,0xc7,0x5b,0x80,0xa2,
        0x66,0x7e,0x2d,0xc4,0xa1,0x7f,0x83,0xec,0x39,0x63,0xcf,0x6f,0x2a,0x86,0x87,0xb5,
        0xe6,0xa9,0xf9,0x64,0x7d,0x91,0xff,0x62,0x30,0x57,0x21,0xcb,0x04,0xd1,0xd6,0x36,
        0x12,0x44,0x33,0x8f,0x52,0x9f,0xc0,0xfc,0xef,0x95,0x41,0x88,0x89,0x0a,0xb6,0x7c,
        0xb1,0x84,0x4b,0xa0,0xb2,0xf0,0x48,0xdf,0x0c,0x73,0xc2,0xca,0x79,0xaf,0x2e,0xb4,
        0x8a,0x65,0xe4,0x8d,0x3f,0xee,0x34,0x8b,0xf3,0x0d,0x08,0x0f,0x9b,0x18,0x2b,0xbe,
        0x31,0xdc,0xaa,0xbd,0x4f,0x26,0xeb,0xb0,0xae,0x75,0xab,0x50,0x2c,0x58,0x1a,0x46,
        0x13,0xf6,0x40,0x27,0xe9,0xfa,0x69,0x5a,0xc8,0xcc,0x4c,0x37,0x01,0x38,0xe8,0xbf,
        0x77,0x8c,0x8e,0x43,0xc6,0x99,0x09,0x92,0x5f,0x20,0xd3,0x59,0x03,0xd5,0xd7,0x00,
        0x02,0xdb,0x4d,0xf2,0x42,0x32,0xd4,0x56,0x07,0x9d,0xce,0x93,0xe3,0xb3,0xb7,0x19,
        0xda,0xb9,0x90,0x15,0xc3,0xfd,0xea,0x98,0xd0,0x54,0xfb,0xbc,0xdd,0x6e,0x76,0x2f,
        0xad,0x1f,0xa7,0x67,0x28,0x24,0x81,0xa3,0x3e,0x25,0x68,0x23,0xc9,0x74,0x1b,0x6b,
        0xf7,0x5d,0xde,0x3a,0x10,0x5e,0xa5,0x9c,0x1c,0xd8,0xd9,0x1e,0xbb,0x7b,0x45,0xe1,
        0x47,0x53,0x71,0x78,0x70,0x82,0x05,0xed,0xba,0xa8,0x35,0xd2,0xac,0xc1,0xa4,0x3c,
        0x06,0x72,0x3d,0xf4,0x9e,0x14,0xfe,0x1d,0x29,0x16,0x94,0x49,0x60,0x5c,0xc5,0x61,
        0xe5,0x7a,0xe7,0xe0,0xf5,0xa6,0x97,0x0b,0x51,0x11,0x6a,0x4e,0x85,0x96,0x9a,0xf8};
    u32 a,b,c,d;
    u64 tempData64,y=0;
    int block;
    
    for(block=0;block<clen;block++)
    {
        tempData64=*(ciphertxt+block);
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x9574a85f*b+0x2f3fd929);
        b ^=P(0x9574a85f*a+0x2f3fd929);
        a ^=P(0x9574a85f*b+0x2f3fd929);
        tempData64 = (u64)b<<32 | a;
        y=0;a=(171*((tempData64>>0 ^ tempData64>>8)-219))&255;
        //62
        b=(S_1[(tempData64>>8)&255]-54)&255;
        b=(171*((b ^a)-41))&255;
        a=(S_1[a]-118)&255;
        y |= (u64)(b<<8|a)<<0;
        y |=(u64)(( s_1[(tempData64>>16)&15]-11)&15)<<16;
        y |=(u64)(( S_1[(tempData64>>20)&255]+189)&255)<<20;
        a=(171*((tempData64>>28 ^ tempData64>>36)-179))&255;
        //66
        b=(S_1[(tempData64>>36)&255]+159)&255;
        b=(171*((b ^a)-25))&255;
        a=(S_1[a]+24)&255;
        y |= (u64)(b<<8|a)<<28;
        a=(171*((tempData64>>44 ^ tempData64>>52)-49))&255;
        //68
        b=(S_1[(tempData64>>52)&255]+226)&255;
        b=(171*((b ^a)-5))&255;
        a=(S_1[a]-253)&255;
        y |= (u64)(b<<8|a)<<44;
        y |=(u64)(( s_1[(tempData64>>60)&15]-5)&15)<<60;
        y=y^((tempData64>>0)&0xf&0xffff)<<16;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x31e204ff*b+0x9ae63275);
        b ^=P(0x31e204ff*a+0x9ae63275);
        a ^=P(0x31e204ff*b+0x9ae63275);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>60)&15]-5)&15)<<60;
        a=(171*((tempData64>>0 ^ tempData64>>8)-67))&255;
        //59
        b=(S_1[(tempData64>>8)&255]-146)&255;
        b=(171*((b ^a)-135))&255;
        a=(S_1[a]-242)&255;
        y |= (u64)(b<<8|a)<<0;
        c=(43691*((tempData64>>16 ^ tempData64>>32)-6425))&65535;
        a=(171*((tempData64>>32 ^ tempData64>>40)-127))&255;
        b=(S_1[(tempData64>>40)&255]+189)&255;
        b=(171*((b ^a)-31))&255;
        a=(S_1[a]-139)&255;
        d=b<<8|a;
        d=(43691*((c^d)-55863))&65535;
        a=(171*((c>>8 ^ c)-41))&255;
        b=(S_1[(c>>8)&255]-118)&255;
        b=(171*((b ^a)-225))&255;
        a=(S_1[a]+86)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<16;
        y |=(u64)(( s_1[(tempData64>>48)&15]+15)&15)<<48;
        y |=(u64)(( S_1[(tempData64>>52)&255]-253)&255)<<52;
        y=y^((tempData64>>60)&0xffffffff&0xf)<<16;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x7fbd1e8b*b+0xb39f1919);
        b ^=P(0x7fbd1e8b*a+0xb39f1919);
        a ^=P(0x7fbd1e8b*b+0xb39f1919);
        tempData64 = (u64)b<<32 | a;
        y=0;c=(43691*((tempData64>>8 ^ tempData64>>24)-34547))&65535;
        a=(171*((tempData64>>24 ^ tempData64>>32)-35))&255;
        b=(S_1[(tempData64>>32)&255]-213)&255;
        b=(171*((b ^a)-171))&255;
        a=(S_1[a]+222)&255;
        d=b<<8|a;
        d=(43691*((c^d)-63807))&65535;
        a=(171*((c>>8 ^ c)-155))&255;
        b=(S_1[(c>>8)&255]+138)&255;
        b=(171*((b ^a)-215))&255;
        a=(S_1[a]-138)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<8;
        a=(171*((tempData64>>40 ^ tempData64>>48)-225))&255;
        //60
        b=(S_1[(tempData64>>48)&255]+86)&255;
        b=(171*((b ^a)-67))&255;
        a=(S_1[a]-146)&255;
        y |= (u64)(b<<8|a)<<40;
        y |=(u64)(( s_1[(tempData64>>56)&15]-6)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-6)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]-139)&255)<<0;
        y=y^((tempData64>>8)&0xf&0xffffffff)<<60;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xe1564293*b+0xda362877);
        b ^=P(0xe1564293*a+0xda362877);
        a ^=P(0xe1564293*b+0xda362877);
        tempData64 = (u64)b<<32 | a;
        y=0;a=(171*((tempData64>>44 ^ tempData64>>52)-85))&255;
        //50
        b=(S_1[(tempData64>>52)&255]+244)&255;
        b=(171*((b ^a)-249))&255;
        a=(S_1[a]+95)&255;
        y |= (u64)(b<<8|a)<<44;
        y |=(u64)(( s_1[(tempData64>>60)&15]-13)&15)<<60;
        c=(43691*((tempData64>>0 ^ tempData64>>16)-8917))&65535;
        a=(171*((tempData64>>16 ^ tempData64>>24)-171))&255;
        b=(S_1[(tempData64>>24)&255]+222)&255;
        b=(171*((b ^a)-249))&255;
        a=(S_1[a]+62)&255;
        d=b<<8|a;
        d=(43691*((c^d)-39819))&65535;
        a=(171*((c>>8 ^ c)-215))&255;
        b=(S_1[(c>>8)&255]-138)&255;
        b=(171*((b ^a)-153))&255;
        a=(S_1[a]+11)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64)(( S_1[(tempData64>>32)&255]-242)&255)<<32;
        y |=(u64)(( s_1[(tempData64>>40)&15]-2)&15)<<40;
        y=y^((tempData64>>44)&0xff&0xffff)<<32;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xabdef93f*b+0x86f222d5);
        b ^=P(0xabdef93f*a+0x86f222d5);
        a ^=P(0xabdef93f*b+0x86f222d5);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( S_1[(tempData64>>36)&255]-91)&255)<<36;
        y |=(u64)(( s_1[(tempData64>>44)&15]+0)&15)<<44;
        y |=(u64)(( s_1[(tempData64>>48)&15]-15)&15)<<48;
        y |=(u64)(( s_1[(tempData64>>52)&15]-3)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]+15)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+4)&15)<<60;
        a=(171*((tempData64>>0 ^ tempData64>>8)-153))&255;
        //52
        b=(S_1[(tempData64>>8)&255]+11)&255;
        b=(171*((b ^a)-191))&255;
        a=(S_1[a]-173)&255;
        y |= (u64)(b<<8|a)<<0;
        y |=(u64)(( S_1[(tempData64>>16)&255]-138)&255)<<16;
        y |=(u64)(( s_1[(tempData64>>24)&15]+10)&15)<<24;
        y |=(u64)(( S_1[(tempData64>>28)&255]+62)&255)<<28;
        y=y^((tempData64>>36)&0xf&0xff)<<44;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x990bbeaf*b+0x9b8ad68b);
        b ^=P(0x990bbeaf*a+0x9b8ad68b);
        a ^=P(0x990bbeaf*b+0x9b8ad68b);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>56)&15]+11)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-10)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]+70)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]+238)&255)<<8;
        y |=(u64)(( s_1[(tempData64>>16)&15]-11)&15)<<16;
        y |=(u64)(( s_1[(tempData64>>20)&15]+0)&15)<<20;
        c=(43691*((tempData64>>24 ^ tempData64>>40)-39179))&65535;
        a=(171*((tempData64>>40 ^ tempData64>>48)-191))&255;
        b=(S_1[(tempData64>>48)&255]-173)&255;
        b=(171*((b ^a)-85))&255;
        a=(S_1[a]+244)&255;
        d=b<<8|a;
        d=(43691*((c^d)-63839))&65535;
        a=(171*((c>>8 ^ c)-151))&255;
        b=(S_1[(c>>8)&255]-179)&255;
        b=(171*((b ^a)-193))&255;
        a=(S_1[a]-111)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<24;
        y=y^((tempData64>>56)&0xf&0xf)<<16;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x96b3c06f*b+0x55f4f95f);
        b ^=P(0x96b3c06f*a+0x55f4f95f);
        a ^=P(0x96b3c06f*b+0x55f4f95f);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>52)&15]-13)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]+2)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+5)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]+28)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]+235)&255)<<8;
        a=(171*((tempData64>>16 ^ tempData64>>24)-155))&255;
        //43
        b=(S_1[(tempData64>>24)&255]+70)&255;
        b=(171*((b ^a)-237))&255;
        a=(S_1[a]-106)&255;
        y |= (u64)(b<<8|a)<<16;
        a=(171*((tempData64>>32 ^ tempData64>>40)-47))&255;
        //45
        b=(S_1[(tempData64>>40)&255]-91)&255;
        b=(171*((b ^a)-197))&255;
        a=(S_1[a]+238)&255;
        y |= (u64)(b<<8|a)<<32;
        y |=(u64)(( s_1[(tempData64>>48)&15]+0)&15)<<48;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xc5ee9b47*b+0xb1e02e5b);
        b ^=P(0xc5ee9b47*a+0xb1e02e5b);
        a ^=P(0xc5ee9b47*b+0xb1e02e5b);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>16)&15]-3)&15)<<16;
        a=(171*((tempData64>>20 ^ tempData64>>28)-211))&255;
        //35
        b=(S_1[(tempData64>>28)&255]+165)&255;
        b=(171*((b ^a)-169))&255;
        a=(S_1[a]+79)&255;
        y |= (u64)(b<<8|a)<<20;
        a=(171*((tempData64>>36 ^ tempData64>>44)-185))&255;
        //37
        b=(S_1[(tempData64>>44)&255]-77)&255;
        b=(171*((b ^a)-149))&255;
        a=(S_1[a]+85)&255;
        y |= (u64)(b<<8|a)<<36;
        y |=(u64)(( s_1[(tempData64>>52)&15]+2)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]+5)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+12)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]+235)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]-106)&255)<<8;
        y=y^((tempData64>>16)&0xf&0xf)<<56;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xd91c5307*b+0xec6a85eb);
        b ^=P(0xd91c5307*a+0xec6a85eb);
        a ^=P(0xd91c5307*b+0xec6a85eb);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>56)&15]-0)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-10)&15)<<60;
        c=(43691*((tempData64>>0 ^ tempData64>>16)-38229))&65535;
        a=(171*((tempData64>>16 ^ tempData64>>24)-211))&255;
        b=(S_1[(tempData64>>24)&255]+165)&255;
        b=(171*((b ^a)-169))&255;
        a=(S_1[a]+79)&255;
        d=b<<8|a;
        d=(43691*((c^d)-50771))&65535;
        a=(171*((c>>8 ^ c)-151))&255;
        b=(S_1[(c>>8)&255]-2)&255;
        b=(171*((b ^a)-175))&255;
        a=(S_1[a]+133)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64)(( S_1[(tempData64>>32)&255]-77)&255)<<32;
        a=(171*((tempData64>>40 ^ tempData64>>48)-83))&255;
        //39
        b=(S_1[(tempData64>>48)&255]+5)&255;
        b=(171*((b ^a)-105))&255;
        a=(S_1[a]+50)&255;
        y |= (u64)(b<<8|a)<<40;
        y=y^((tempData64>>56)&0xffff&0xf)<<40;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x9555d3a7*b+0x6932b84d);
        b ^=P(0x9555d3a7*a+0x6932b84d);
        a ^=P(0x9555d3a7*b+0x6932b84d);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>0)&15]+4)&15)<<0;
        c=(43691*((tempData64>>4 ^ tempData64>>20)-44933))&65535;
        a=(171*((tempData64>>20 ^ tempData64>>28)-139))&255;
        b=(S_1[(tempData64>>28)&255]-10)&255;
        b=(171*((b ^a)-209))&255;
        a=(S_1[a]-208)&255;
        d=b<<8|a;
        d=(43691*((c^d)-10201))&65535;
        a=(171*((c>>8 ^ c)-107))&255;
        b=(S_1[(c>>8)&255]+143)&255;
        b=(171*((b ^a)-71))&255;
        a=(S_1[a]+197)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<4;
        y |=(u64)(( S_1[(tempData64>>36)&255]-2)&255)<<36;
        y |=(u64)(( S_1[(tempData64>>44)&255]-83)&255)<<44;
        y |=(u64)(( S_1[(tempData64>>52)&255]+79)&255)<<52;
        y |=(u64)(( s_1[(tempData64>>60)&15]+5)&15)<<60;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x9602af87*b+0xa94fc653);
        b ^=P(0x9602af87*a+0xa94fc653);
        a ^=P(0x9602af87*b+0xa94fc653);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( S_1[(tempData64>>48)&255]+20)&255)<<48;
        y |=(u64)(( s_1[(tempData64>>56)&15]-3)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+12)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]-220)&255)<<0;
        c=(43691*((tempData64>>8 ^ tempData64>>24)-35339))&65535;
        a=(171*((tempData64>>24 ^ tempData64>>32)-209))&255;
        b=(S_1[(tempData64>>32)&255]-208)&255;
        b=(171*((b ^a)-39))&255;
        a=(S_1[a]+216)&255;
        d=b<<8|a;
        d=(43691*((c^d)-27535))&65535;
        a=(171*((c>>8 ^ c)-71))&255;
        b=(S_1[(c>>8)&255]+197)&255;
        b=(171*((b ^a)-5))&255;
        a=(S_1[a]+52)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<8;
        y |=(u64)(( s_1[(tempData64>>40)&15]+5)&15)<<40;
        y |=(u64)(( s_1[(tempData64>>44)&15]-2)&15)<<44;
        y=y^((tempData64>>48)&0xff&0xff)<<0;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x27d86b8f*b+0x8a0ad0d1);
        b ^=P(0x27d86b8f*a+0x8a0ad0d1);
        a ^=P(0x27d86b8f*b+0x8a0ad0d1);
        tempData64 = (u64)b<<32 | a;
        y=0;c=(43691*((tempData64>>20 ^ tempData64>>36)-39427))&65535;
        a=(171*((tempData64>>36 ^ tempData64>>44)-95))&255;
        b=(S_1[(tempData64>>44)&255]+20)&255;
        b=(171*((b ^a)-183))&255;
        a=(S_1[a]+59)&255;
        d=b<<8|a;
        d=(43691*((c^d)-32269))&65535;
        a=(171*((c>>8 ^ c)-141))&255;
        b=(S_1[(c>>8)&255]-145)&255;
        b=(171*((b ^a)-195))&255;
        a=(S_1[a]-182)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<20;
        y |=(u64)(( s_1[(tempData64>>52)&15]+12)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]-12)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+4)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]+197)&255)<<0;
        y |=(u64)(( s_1[(tempData64>>8)&15]+15)&15)<<8;
        y |=(u64)(( S_1[(tempData64>>12)&255]+216)&255)<<12;
        y=y^((tempData64>>20)&0xf&0xffffffff)<<8;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xa6dcd75f*b+0x47c50535);
        b ^=P(0xa6dcd75f*a+0x47c50535);
        a ^=P(0xa6dcd75f*b+0x47c50535);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>36)&15]-0)&15)<<36;
        y |=(u64)(( S_1[(tempData64>>40)&255]-171)&255)<<40;
        y |=(u64)(( S_1[(tempData64>>48)&255]-209)&255)<<48;
        y |=(u64)(( s_1[(tempData64>>56)&15]-10)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-6)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]-145)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]-13)&255)<<8;
        y |=(u64)(( s_1[(tempData64>>16)&15]+11)&15)<<16;
        a=(171*((tempData64>>20 ^ tempData64>>28)-155))&255;
        //22
        b=(S_1[(tempData64>>28)&255]-3)&255;
        b=(171*((b ^a)-95))&255;
        a=(S_1[a]+20)&255;
        y |= (u64)(b<<8|a)<<20;
        y=y^((tempData64>>36)&0xffff&0xf)<<20;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xb73b7e0f*b+0x9a035f15);
        b ^=P(0xb73b7e0f*a+0x9a035f15);
        a ^=P(0xb73b7e0f*b+0x9a035f15);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>0)&15]-0)&15)<<0;
        y |=(u64)(( s_1[(tempData64>>4)&15]+2)&15)<<4;
        y |=(u64)(( S_1[(tempData64>>8)&255]-133)&255)<<8;
        y |=(u64)(( s_1[(tempData64>>16)&15]-13)&15)<<16;
        y |=(u64)(( s_1[(tempData64>>20)&15]-0)&15)<<20;
        c=(43691*((tempData64>>24 ^ tempData64>>40)-32269))&65535;
        a=(171*((tempData64>>40 ^ tempData64>>48)-141))&255;
        b=(S_1[(tempData64>>48)&255]-145)&255;
        b=(171*((b ^a)-195))&255;
        a=(S_1[a]-182)&255;
        d=b<<8|a;
        d=(43691*((c^d)-55339))&65535;
        a=(171*((c>>8 ^ c)-49))&255;
        b=(S_1[(c>>8)&255]-209)&255;
        b=(171*((b ^a)-67))&255;
        a=(S_1[a]-171)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<24;
        y |=(u64)(( s_1[(tempData64>>56)&15]+11)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+4)&15)<<60;
        y=y^((tempData64>>0)&0xf&0xf)<<16;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xd82a30d3*b+0x8c91c2b7);
        b ^=P(0xd82a30d3*a+0x8c91c2b7);
        a ^=P(0xd82a30d3*b+0x8c91c2b7);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>40)&15]+15)&15)<<40;
        y |=(u64)(( s_1[(tempData64>>44)&15]+10)&15)<<44;
        y |=(u64)(( S_1[(tempData64>>48)&255]-16)&255)<<48;
        y |=(u64)(( S_1[(tempData64>>56)&255]+64)&255)<<56;
        a=(171*((tempData64>>0 ^ tempData64>>8)-191))&255;
        //10
        b=(S_1[(tempData64>>8)&255]+66)&255;
        b=(171*((b ^a)-95))&255;
        a=(S_1[a]-64)&255;
        y |= (u64)(b<<8|a)<<0;
        a=(171*((tempData64>>16 ^ tempData64>>24)-205))&255;
        //12
        b=(S_1[(tempData64>>24)&255]-61)&255;
        b=(171*((b ^a)-85))&255;
        a=(S_1[a]-133)&255;
        y |= (u64)(b<<8|a)<<16;
        y |=(u64)(( S_1[(tempData64>>32)&255]-16)&255)<<32;
        y=y^((tempData64>>40)&0xff&0xf)<<32;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xcc3d5487*b+0x42ab9a11);
        b ^=P(0xcc3d5487*a+0x42ab9a11);
        a ^=P(0xcc3d5487*b+0x42ab9a11);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>52)&15]+5)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]+3)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-10)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]-90)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]+63)&255)<<8;
        a=(171*((tempData64>>16 ^ tempData64>>24)-61))&255;
        //7
        b=(S_1[(tempData64>>24)&255]-16)&255;
        b=(171*((b ^a)-135))&255;
        a=(S_1[a]+106)&255;
        y |= (u64)(b<<8|a)<<16;
        y |=(u64)(( s_1[(tempData64>>32)&15]+0)&15)<<32;
        a=(171*((tempData64>>36 ^ tempData64>>44)-191))&255;
        //10
        b=(S_1[(tempData64>>44)&255]+66)&255;
        b=(171*((b ^a)-95))&255;
        a=(S_1[a]-64)&255;
        y |= (u64)(b<<8|a)<<36;
        y=y^((tempData64>>52)&0xff&0xf)<<0;
        tempData64=y;
        *(plaintxt+block) = tempData64;
    }
    return block;
}


int encryptZSA(u64* plaintxt, int plen, u64* ciphertxt)
{
    static u8 s[16]={0x9,0xd,0x7,0x6,0xa,0xf,0x1,0x3,0xe,0x2,0x4,0x8,0xc,0x0,0xb,0x5};
    static u8 S[256]={0x43,0xda,0xd3,0xc5,0xeb,0xfc,0x96,0xa8,0xc6,0x71,0xae,0x74,0xde,0x16,0x03,0x24,
        0x8b,0x9a,0x80,0x92,0xa5,0xb6,0x90,0xba,0xc0,0xbd,0xa4,0x48,0x72,0x84,0x6c,0x2c,
        0xad,0x37,0xee,0x44,0x1f,0xb2,0xfd,0xdd,0x65,0xa0,0xf1,0x13,0xea,0xd0,0x45,0xf9,
        0xd9,0xe7,0xc1,0xc9,0x33,0x26,0x51,0x53,0x62,0x8f,0xcb,0x27,0x5b,0x4f,0x0f,0xa9,
        0x5c,0x42,0x1a,0x09,0x57,0xab,0x79,0x7c,0xce,0x75,0xe6,0x23,0x19,0x25,0xd4,0x17,
        0x60,0x70,0xfb,0x86,0xb4,0x32,0x88,0xd7,0x7a,0x8c,0x82,0xb1,0x52,0x8d,0x1c,0xa1,
        0xc2,0x08,0x77,0x12,0x39,0x5e,0x83,0x41,0xb8,0xc7,0x2a,0x15,0xcc,0x9b,0xff,0xe9,
        0x91,0xac,0x66,0x85,0x6f,0xb3,0xd2,0xb9,0xca,0x2b,0xdf,0xaf,0x1b,0x46,0xbf,0xed,
        0x55,0x9f,0x0b,0x97,0xd5,0xc4,0x8a,0xa2,0xd1,0x94,0x95,0x8e,0xd6,0xf6,0x40,0x7f,
        0x3a,0xbe,0xf8,0xfa,0x04,0x59,0x3d,0xf0,0x0a,0x9d,0x61,0x11,0xbc,0x07,0xd8,0x47,
        0x93,0xdb,0x1e,0xec,0x3f,0xf4,0xbb,0x3e,0x05,0x58,0xcd,0xaa,0x06,0xe8,0xc3,0xe4,
        0x73,0x35,0x98,0x4d,0x4e,0x87,0x63,0x64,0x0c,0x02,0xef,0x67,0x0d,0x28,0xf3,0x68,
        0x10,0x7d,0x69,0x6a,0x89,0x01,0x4a,0x0e,0x6d,0x6e,0x30,0x4b,0xe3,0x38,0x36,0xe0,
        0x21,0x78,0x2f,0x14,0xc8,0x6b,0xe2,0xcf,0x9e,0xe5,0x1d,0xf2,0x9c,0x50,0x7e,0x3b,
        0xfe,0x54,0x5a,0xf5,0x5d,0x29,0x4c,0xb0,0x3c,0x2d,0xa3,0xdc,0xf7,0x5f,0xe1,0x76,
        0x99,0x49,0x22,0x20,0x7b,0x81,0xb7,0x00,0xb5,0x31,0xa6,0x34,0x2e,0x18,0xa7,0x56};
    u32 a,b,c,d;
    u64 tempData64,y=0;
    int block;
    
    for(block=0;block<plen;block++)
    {
        tempData64=*(plaintxt+block);
        y=0;y |=(u64) S[(((tempData64>>56)&255)+111)&255]<<56;
        tempData64^=((y>>56)&0xff)<<0;
        y |=(u64) S[(((tempData64>>0)&255)-254)&255]<<0;
        y |=(u64) s[(((tempData64>>8)&15)+1)&15]<<8;
        y |=(u64) s[(((tempData64>>12)&15)-6)&15]<<12;
        y |=(u64) s[(((tempData64>>16)&15)-15)&15]<<16;
        c = (unsigned int)(tempData64>>20);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-66)&255];
        b=((3*((c>>8)&255)+251)&255)^a;
        b=S[(b+74)&255];
        a=((3*a+43)&255)^b;
        c = b<<8|a;
        d = ((3*d)+28051)^c;
        a=S[((d&255)+255)&255];
        b=((3*((d>>8)&255)+249)&255)^a;
        b=S[(b-142)&255];
        a=((3*a+25)&255)^b;
        d = b<<8|a;
        c = (((3*c)+13163)&65535)^d;
        y|=(u64)(d<<16|c)<<20;
        y |=(u64) s[(((tempData64>>52)&15)+7)&15]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x3cd7336b*b+0x891c6671);
        b ^=P(0x3cd7336b*a+0x891c6671);
        a ^=P(0x3cd7336b*b+0x891c6671);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>60)&15)-15)&15]<<60;
        tempData64^=((y>>60)&0xff)<<0;
        y |=(u64) S[(((tempData64>>0)&255)-66)&255]<<0;
        y |=(u64) s[(((tempData64>>8)&15)+10)&15]<<8;
        c = (unsigned int)(tempData64>>12);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-147)&255];
        b=((3*((c>>8)&255)+109)&255)^a;
        b=S[(b+255)&255];
        a=((3*a+249)&255)^b;
        c = b<<8|a;
        d = ((3*d)+6543)^c;
        a=S[((d&255)-107)&255];
        b=((3*((d>>8)&255)+51)&255)^a;
        b=S[(b+215)&255];
        a=((3*a+61)&255)^b;
        d = b<<8|a;
        c = (((3*c)+26225)&65535)^d;
        y|=(u64)(d<<16|c)<<12;
        y |=(u64) s[(((tempData64>>44)&15)-12)&15]<<44;
        y |=(u64) s[(((tempData64>>48)&15)-12)&15]<<48;
        y |=(u64) S[(((tempData64>>52)&255)-132)&255]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xff84df2f*b+0xcbb5cc39);
        b ^=P(0xff84df2f*a+0xcbb5cc39);
        a ^=P(0xff84df2f*b+0xcbb5cc39);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>36)&255)+255)&255]<<36;
        tempData64^=((y>>36)&0xffff)<<16;
        a=S[(((tempData64>>44)&255)-142)&255];
        b=((3*((tempData64>>52)&255)+25)&255)^a;
        b=S[(b-107)&255];
        a=((3*a+51)&255)^b;
        y |= (u64)(b<<8|a)<<44;
        y |=(u64) s[(((tempData64>>60)&15)+7)&15]<<60;
        a=S[(((tempData64>>0)&255)+112)&255];
        b=((3*((tempData64>>8)&255)+103)&255)^a;
        b=S[(b-28)&255];
        a=((3*a+137)&255)^b;
        y |= (u64)(b<<8|a)<<0;
        a=S[(((tempData64>>16)&255)-44)&255];
        b=((3*((tempData64>>24)&255)+223)&255)^a;
        b=S[(b-132)&255];
        a=((3*a+255)&255)^b;
        y |= (u64)(b<<8|a)<<16;
        y |=(u64) s[(((tempData64>>32)&15)+8)&15]<<32;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x5d7da813*b+0xf970c717);
        b ^=P(0x5d7da813*a+0xf970c717);
        a ^=P(0x5d7da813*b+0xf970c717);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>48)&15)+0)&15]<<48;
        y |=(u64) s[(((tempData64>>52)&15)-12)&15]<<52;
        y |=(u64) S[(((tempData64>>56)&255)-44)&255]<<56;
        c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-132)&255];
        b=((3*((c>>8)&255)+255)&255)^a;
        b=S[(b+56)&255];
        a=((3*a+205)&255)^b;
        c = b<<8|a;
        d = ((3*d)+52149)^c;
        a=S[((d&255)+19)&255];
        b=((3*((d>>8)&255)+169)&255)^a;
        b=S[(b-125)&255];
        a=((3*a+93)&255)^b;
        d = b<<8|a;
        c = (((3*c)+50967)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        a=S[(((tempData64>>32)&255)-112)&255];
        b=((3*((tempData64>>40)&255)+249)&255)^a;
        b=S[(b-17)&255];
        a=((3*a+127)&255)^b;
        y |= (u64)(b<<8|a)<<32;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xfdff7f13*b+0xf2af3111);
        b ^=P(0xfdff7f13*a+0xf2af3111);
        a ^=P(0xfdff7f13*b+0xf2af3111);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>56)&255)+56)&255]<<56;
        tempData64^=((y>>56)&0xf)<<0;
        y |=(u64) s[(((tempData64>>0)&15)-5)&15]<<0;
        c = (unsigned int)(tempData64>>4);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+19)&255];
        b=((3*((c>>8)&255)+169)&255)^a;
        b=S[(b-125)&255];
        a=((3*a+93)&255)^b;
        c = b<<8|a;
        d = ((3*d)+50967)^c;
        a=S[((d&255)-112)&255];
        b=((3*((d>>8)&255)+249)&255)^a;
        b=S[(b-17)&255];
        a=((3*a+127)&255)^b;
        d = b<<8|a;
        c = (((3*c)+65023)&65535)^d;
        y|=(u64)(d<<16|c)<<4;
        a=S[(((tempData64>>36)&255)-17)&255];
        b=((3*((tempData64>>44)&255)+49)&255)^a;
        b=S[(b+175)&255];
        a=((3*a+243)&255)^b;
        y |= (u64)(b<<8|a)<<36;
        y |=(u64) s[(((tempData64>>52)&15)-3)&15]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xcefe8943*b+0xeaef863f);
        b ^=P(0xcefe8943*a+0xeaef863f);
        a ^=P(0xcefe8943*b+0xeaef863f);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>56)&255)-22)&255]<<56;
        c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-112)&255];
        b=((3*((c>>8)&255)+249)&255)^a;
        b=S[(b-17)&255];
        a=((3*a+127)&255)^b;
        c = b<<8|a;
        d = ((3*d)+65023)^c;
        a=S[((d&255)-17)&255];
        b=((3*((d>>8)&255)+49)&255)^a;
        b=S[(b+175)&255];
        a=((3*a+243)&255)^b;
        d = b<<8|a;
        c = (((3*c)+35139)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64) s[(((tempData64>>32)&15)+14)&15]<<32;
        y |=(u64) S[(((tempData64>>36)&255)+63)&255]<<36;
        y |=(u64) s[(((tempData64>>44)&15)+15)&15]<<44;
        y |=(u64) s[(((tempData64>>48)&15)-11)&15]<<48;
        y |=(u64) s[(((tempData64>>52)&15)-5)&15]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x1d8587bb*b+0xf4126537);
        b ^=P(0x1d8587bb*a+0xf4126537);
        a ^=P(0x1d8587bb*b+0xf4126537);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>20)&15)-1)&15]<<20;
        tempData64^=((y>>20)&0xf)<<8;
        c = (unsigned int)(tempData64>>24);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+175)&255];
        b=((3*((c>>8)&255)+243)&255)^a;
        b=S[(b-67)&255];
        a=((3*a+137)&255)^b;
        c = b<<8|a;
        d = ((3*d)+52991)^c;
        a=S[((d&255)+63)&255];
        b=((3*((d>>8)&255)+135)&255)^a;
        b=S[(b+239)&255];
        a=((3*a+235)&255)^b;
        d = b<<8|a;
        c = (((3*c)+34747)&65535)^d;
        y|=(u64)(d<<16|c)<<24;
        y |=(u64) S[(((tempData64>>56)&255)-133)&255]<<56;
        y |=(u64) S[(((tempData64>>0)&255)-55)&255]<<0;
        y |=(u64) s[(((tempData64>>8)&15)+2)&15]<<8;
        y |=(u64) S[(((tempData64>>12)&255)-240)&255]<<12;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x8946bbf3*b+0xa569b02d);
        b ^=P(0x8946bbf3*a+0xa569b02d);
        a ^=P(0x8946bbf3*b+0xa569b02d);
        tempData64 = (u64)b<<32 | a;
        y=0;c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+63)&255];
        b=((3*((c>>8)&255)+135)&255)^a;
        b=S[(b+239)&255];
        a=((3*a+235)&255)^b;
        c = b<<8|a;
        d = ((3*d)+34747)^c;
        a=S[((d&255)-133)&255];
        b=((3*((d>>8)&255)+29)&255)^a;
        b=S[(b-55)&255];
        a=((3*a+101)&255)^b;
        d = b<<8|a;
        c = (((3*c)+62483)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64) s[(((tempData64>>32)&15)-0)&15]<<32;
        y |=(u64) s[(((tempData64>>36)&15)-6)&15]<<36;
        y |=(u64) S[(((tempData64>>40)&255)+44)&255]<<40;
        y |=(u64) S[(((tempData64>>48)&255)-105)&255]<<48;
        y |=(u64) s[(((tempData64>>56)&15)-3)&15]<<56;
        y |=(u64) s[(((tempData64>>60)&15)-10)&15]<<60;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xafcad373*b+0xb331bda3);
        b ^=P(0xafcad373*a+0xb331bda3);
        a ^=P(0xafcad373*b+0xb331bda3);
        tempData64 = (u64)b<<32 | a;
        y=0;c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-55)&255];
        b=((3*((c>>8)&255)+101)&255)^a;
        b=S[(b+18)&255];
        a=((3*a+245)&255)^b;
        c = b<<8|a;
        d = ((3*d)+48113)^c;
        a=S[((d&255)-70)&255];
        b=((3*((d>>8)&255)+137)&255)^a;
        b=S[(b+44)&255];
        a=((3*a+177)&255)^b;
        d = b<<8|a;
        c = (((3*c)+42345)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        tempData64^=((y>>0)&0xf)<<56;
        a=S[(((tempData64>>32)&255)-115)&255];
        b=((3*((tempData64>>40)&255)+211)&255)^a;
        b=S[(b-202)&255];
        a=((3*a+175)&255)^b;
        y |= (u64)(b<<8|a)<<32;
        y |=(u64) S[(((tempData64>>48)&255)-163)&255]<<48;
        y |=(u64) s[(((tempData64>>56)&15)-1)&15]<<56;
        y |=(u64) s[(((tempData64>>60)&15)+14)&15]<<60;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x70d06e7f*b+0x8449fb77);
        b ^=P(0x70d06e7f*a+0x8449fb77);
        a ^=P(0x70d06e7f*b+0x8449fb77);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>0)&15)+12)&15]<<0;
        tempData64^=((y>>0)&0xffff)<<40;
        y |=(u64) s[(((tempData64>>4)&15)-9)&15]<<4;
        c = (unsigned int)(tempData64>>8);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-115)&255];
        b=((3*((c>>8)&255)+211)&255)^a;
        b=S[(b-202)&255];
        a=((3*a+175)&255)^b;
        c = b<<8|a;
        d = ((3*d)+48547)^c;
        a=S[((d&255)-49)&255];
        b=((3*((d>>8)&255)+179)&255)^a;
        b=S[(b+126)&255];
        a=((3*a+111)&255)^b;
        d = b<<8|a;
        c = (((3*c)+28881)&65535)^d;
        y|=(u64)(d<<16|c)<<8;
        a=S[(((tempData64>>40)&255)-118)&255];
        b=((3*((tempData64>>48)&255)+251)&255)^a;
        b=S[(b+73)&255];
        a=((3*a+133)&255)^b;
        y |= (u64)(b<<8|a)<<40;
        y |=(u64) s[(((tempData64>>56)&15)-12)&15]<<56;
        y |=(u64) s[(((tempData64>>60)&15)+3)&15]<<60;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x448381ef*b+0x1ac06611);
        b ^=P(0x448381ef*a+0x1ac06611);
        a ^=P(0x448381ef*b+0x1ac06611);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>56)&15)-3)&15]<<56;
        tempData64^=((y>>56)&0xf)<<52;
        y |=(u64) s[(((tempData64>>60)&15)-1)&15]<<60;
        c = (unsigned int)(tempData64>>0);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+126)&255];
        b=((3*((c>>8)&255)+111)&255)^a;
        b=S[(b+208)&255];
        a=((3*a+113)&255)^b;
        c = b<<8|a;
        d = ((3*d)+64375)^c;
        a=S[((d&255)+73)&255];
        b=((3*((d>>8)&255)+133)&255)^a;
        b=S[(b-236)&255];
        a=((3*a+129)&255)^b;
        d = b<<8|a;
        c = (((3*c)+17539)&65535)^d;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64) s[(((tempData64>>32)&15)+1)&15]<<32;
        a=S[(((tempData64>>36)&255)+192)&255];
        b=((3*((tempData64>>44)&255)+27)&255)^a;
        b=S[(b+145)&255];
        a=((3*a+83)&255)^b;
        y |= (u64)(b<<8|a)<<36;
        y |=(u64) s[(((tempData64>>52)&15)-0)&15]<<52;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xb7405293*b+0xae0e971b);
        b ^=P(0xb7405293*a+0xae0e971b);
        a ^=P(0xb7405293*b+0xae0e971b);
        tempData64 = (u64)b<<32 | a;
        y=0;a=S[(((tempData64>>0)&255)-118)&255];
        b=((3*((tempData64>>8)&255)+251)&255)^a;
        b=S[(b+73)&255];
        a=((3*a+133)&255)^b;
        y |= (u64)(b<<8|a)<<0;
        c = (unsigned int)(tempData64>>16);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-236)&255];
        b=((3*((c>>8)&255)+129)&255)^a;
        b=S[(b+131)&255];
        a=((3*a+69)&255)^b;
        c = b<<8|a;
        d = ((3*d)+26129)^c;
        a=S[((d&255)+192)&255];
        b=((3*((d>>8)&255)+27)&255)^a;
        b=S[(b+145)&255];
        a=((3*a+83)&255)^b;
        d = b<<8|a;
        c = (((3*c)+46913)&65535)^d;
        y|=(u64)(d<<16|c)<<16;
        y |=(u64) S[(((tempData64>>48)&255)-26)&255]<<48;
        y |=(u64) S[(((tempData64>>56)&255)+14)&255]<<56;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x2c34e3d7*b+0xe9eafd41);
        b ^=P(0x2c34e3d7*a+0xe9eafd41);
        a ^=P(0x2c34e3d7*b+0xe9eafd41);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>52)&255)+17)&255]<<52;
        tempData64^=((y>>52)&0xf)<<60;
        y |=(u64) s[(((tempData64>>60)&15)+0)&15]<<60;
        y |=(u64) s[(((tempData64>>0)&15)+1)&15]<<0;
        c = (unsigned int)(tempData64>>4);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-64)&255];
        b=((3*((c>>8)&255)+183)&255)^a;
        b=S[(b-26)&255];
        a=((3*a+151)&255)^b;
        c = b<<8|a;
        d = ((3*d)+44559)^c;
        a=S[((d&255)-212)&255];
        b=((3*((d>>8)&255)+227)&255)^a;
        b=S[(b+52)&255];
        a=((3*a+45)&255)^b;
        d = b<<8|a;
        c = (((3*c)+64833)&65535)^d;
        y|=(u64)(d<<16|c)<<4;
        a=S[(((tempData64>>36)&255)-234)&255];
        b=((3*((tempData64>>44)&255)+233)&255)^a;
        b=S[(b-78)&255];
        a=((3*a+123)&255)^b;
        y |= (u64)(b<<8|a)<<36;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xf8187b4f*b+0xfa7e5f07);
        b ^=P(0xf8187b4f*a+0xfa7e5f07);
        a ^=P(0xf8187b4f*b+0xfa7e5f07);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>0)&255)-26)&255]<<0;
        y |=(u64) s[(((tempData64>>8)&15)+14)&15]<<8;
        y |=(u64) S[(((tempData64>>12)&255)-212)&255]<<12;
        a=S[(((tempData64>>20)&255)+52)&255];
        b=((3*((tempData64>>28)&255)+45)&255)^a;
        b=S[(b-65)&255];
        a=((3*a+253)&255)^b;
        y |= (u64)(b<<8|a)<<20;
        a=S[(((tempData64>>36)&255)-234)&255];
        b=((3*((tempData64>>44)&255)+233)&255)^a;
        b=S[(b-78)&255];
        a=((3*a+123)&255)^b;
        y |= (u64)(b<<8|a)<<36;
        y |=(u64) s[(((tempData64>>52)&15)+8)&15]<<52;
        y |=(u64) S[(((tempData64>>56)&255)-6)&255]<<56;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x81fd29ab*b+0x1bb396a3);
        b ^=P(0x81fd29ab*a+0x1bb396a3);
        a ^=P(0x81fd29ab*b+0x1bb396a3);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) s[(((tempData64>>52)&15)-1)&15]<<52;
        tempData64^=((y>>52)&0xf)<<56;
        y |=(u64) s[(((tempData64>>56)&15)-10)&15]<<56;
        y |=(u64) s[(((tempData64>>60)&15)-14)&15]<<60;
        y |=(u64) s[(((tempData64>>0)&15)+8)&15]<<0;
        y |=(u64) S[(((tempData64>>4)&255)-6)&255]<<4;
        y |=(u64) S[(((tempData64>>12)&255)+126)&255]<<12;
        c = (unsigned int)(tempData64>>20);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)-168)&255];
        b=((3*((c>>8)&255)+41)&255)^a;
        b=S[(b-253)&255];
        a=((3*a+129)&255)^b;
        c = b<<8|a;
        d = ((3*d)+38563)^c;
        a=S[((d&255)-179)&255];
        b=((3*((d>>8)&255)+27)&255)^a;
        b=S[(b-247)&255];
        a=((3*a+203)&255)^b;
        d = b<<8|a;
        c = (((3*c)+38583)&65535)^d;
        y|=(u64)(d<<16|c)<<20;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0x96b6cbf7*b+0x55e6c6db);
        b ^=P(0x96b6cbf7*a+0x55e6c6db);
        a ^=P(0x96b6cbf7*b+0x55e6c6db);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64) S[(((tempData64>>52)&255)-6)&255]<<52;
        y |=(u64) s[(((tempData64>>60)&15)+14)&15]<<60;
        a=S[(((tempData64>>0)&255)-168)&255];
        b=((3*((tempData64>>8)&255)+41)&255)^a;
        b=S[(b-253)&255];
        a=((3*a+129)&255)^b;
        y |= (u64)(b<<8|a)<<0;
        c = (unsigned int)(tempData64>>16);
        d=c>>16;
        c&=0xffff;
        a=S[((c&255)+163)&255];
        b=((3*((c>>8)&255)+151)&255)^a;
        b=S[(b-179)&255];
        a=((3*a+27)&255)^b;
        c = b<<8|a;
        d = ((3*d)+52215)^c;
        a=S[((d&255)+182)&255];
        b=((3*((d>>8)&255)+151)&255)^a;
        b=S[(b+219)&255];
        a=((3*a+199)&255)^b;
        d = b<<8|a;
        c = (((3*c)+21991)&65535)^d;
        y|=(u64)(d<<16|c)<<16;
        y |=(u64) s[(((tempData64>>48)&15)-11)&15]<<48;
        a = (u32)(y &0xffffffff);
        b=(u32)(y>>32);
        a ^=P(0xb948c9bb*b+0x4f2a245f);
        b ^=P(0xb948c9bb*a+0x4f2a245f);
        a ^=P(0xb948c9bb*b+0x4f2a245f);
        tempData64 = (u64)b<<32 | a;
        *(ciphertxt+block) = tempData64;
    }
    return block;
}

int decryptZSB(u64* ciphertxt, int clen, u64* plaintxt)
{
    static u8 s_1[16]={0x0,0x5,0x2,0x9,0x8,0xb,0x6,0xa,0x1,0x7,0xc,0xe,0x3,0xd,0xf,0x4};
    static u8 S_1[256]={0xb8,0x6d,0x6c,0x4a,0xe2,0x17,0xf1,0x22,0x0e,0x55,0x3b,0xcd,0xc7,0x5b,0x80,0xa2,
        0x66,0x7e,0x2d,0xc4,0xa1,0x7f,0x83,0xec,0x39,0x63,0xcf,0x6f,0x2a,0x86,0x87,0xb5,
        0xe6,0xa9,0xf9,0x64,0x7d,0x91,0xff,0x62,0x30,0x57,0x21,0xcb,0x04,0xd1,0xd6,0x36,
        0x12,0x44,0x33,0x8f,0x52,0x9f,0xc0,0xfc,0xef,0x95,0x41,0x88,0x89,0x0a,0xb6,0x7c,
        0xb1,0x84,0x4b,0xa0,0xb2,0xf0,0x48,0xdf,0x0c,0x73,0xc2,0xca,0x79,0xaf,0x2e,0xb4,
        0x8a,0x65,0xe4,0x8d,0x3f,0xee,0x34,0x8b,0xf3,0x0d,0x08,0x0f,0x9b,0x18,0x2b,0xbe,
        0x31,0xdc,0xaa,0xbd,0x4f,0x26,0xeb,0xb0,0xae,0x75,0xab,0x50,0x2c,0x58,0x1a,0x46,
        0x13,0xf6,0x40,0x27,0xe9,0xfa,0x69,0x5a,0xc8,0xcc,0x4c,0x37,0x01,0x38,0xe8,0xbf,
        0x77,0x8c,0x8e,0x43,0xc6,0x99,0x09,0x92,0x5f,0x20,0xd3,0x59,0x03,0xd5,0xd7,0x00,
        0x02,0xdb,0x4d,0xf2,0x42,0x32,0xd4,0x56,0x07,0x9d,0xce,0x93,0xe3,0xb3,0xb7,0x19,
        0xda,0xb9,0x90,0x15,0xc3,0xfd,0xea,0x98,0xd0,0x54,0xfb,0xbc,0xdd,0x6e,0x76,0x2f,
        0xad,0x1f,0xa7,0x67,0x28,0x24,0x81,0xa3,0x3e,0x25,0x68,0x23,0xc9,0x74,0x1b,0x6b,
        0xf7,0x5d,0xde,0x3a,0x10,0x5e,0xa5,0x9c,0x1c,0xd8,0xd9,0x1e,0xbb,0x7b,0x45,0xe1,
        0x47,0x53,0x71,0x78,0x70,0x82,0x05,0xed,0xba,0xa8,0x35,0xd2,0xac,0xc1,0xa4,0x3c,
        0x06,0x72,0x3d,0xf4,0x9e,0x14,0xfe,0x1d,0x29,0x16,0x94,0x49,0x60,0x5c,0xc5,0x61,
        0xe5,0x7a,0xe7,0xe0,0xf5,0xa6,0x97,0x0b,0x51,0x11,0x6a,0x4e,0x85,0x96,0x9a,0xf8};
    u32 a,b,c,d;
    u64 tempData64,y=0;
    int block;
    
    for(block=0;block<clen;block++)
    {
        tempData64=*(ciphertxt+block);
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x9574a85f*b+0x2f3fd929);
        b ^=P(0x9574a85f*a+0x2f3fd929);
        a ^=P(0x9574a85f*b+0x2f3fd929);
        tempData64 = (u64)b<<32 | a;
        y=0;a=(171*((tempData64>>0 ^ tempData64>>8)-219))&255;
        //62
        b=(S_1[(tempData64>>8)&255]-54)&255;
        b=(171*((b ^a)-41))&255;
        a=(S_1[a]-118)&255;
        y |= (u64)(b<<8|a)<<0;
        y |=(u64)(( s_1[(tempData64>>16)&15]-11)&15)<<16;
        y |=(u64)(( S_1[(tempData64>>20)&255]+189)&255)<<20;
        a=(171*((tempData64>>28 ^ tempData64>>36)-179))&255;
        //66
        b=(S_1[(tempData64>>36)&255]+159)&255;
        b=(171*((b ^a)-25))&255;
        a=(S_1[a]+24)&255;
        y |= (u64)(b<<8|a)<<28;
        a=(171*((tempData64>>44 ^ tempData64>>52)-49))&255;
        //68
        b=(S_1[(tempData64>>52)&255]+226)&255;
        b=(171*((b ^a)-5))&255;
        a=(S_1[a]-253)&255;
        y |= (u64)(b<<8|a)<<44;
        y |=(u64)(( s_1[(tempData64>>60)&15]-5)&15)<<60;
        y=y^((tempData64>>0)&0xf&0xffff)<<16;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x31e204ff*b+0x9ae63275);
        b ^=P(0x31e204ff*a+0x9ae63275);
        a ^=P(0x31e204ff*b+0x9ae63275);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>60)&15]-5)&15)<<60;
        a=(171*((tempData64>>0 ^ tempData64>>8)-67))&255;
        //59
        b=(S_1[(tempData64>>8)&255]-146)&255;
        b=(171*((b ^a)-135))&255;
        a=(S_1[a]-242)&255;
        y |= (u64)(b<<8|a)<<0;
        c=(43691*((tempData64>>16 ^ tempData64>>32)-6425))&65535;
        a=(171*((tempData64>>32 ^ tempData64>>40)-127))&255;
        b=(S_1[(tempData64>>40)&255]+189)&255;
        b=(171*((b ^a)-31))&255;
        a=(S_1[a]-139)&255;
        d=b<<8|a;
        d=(43691*((c^d)-55863))&65535;
        a=(171*((c>>8 ^ c)-41))&255;
        b=(S_1[(c>>8)&255]-118)&255;
        b=(171*((b ^a)-225))&255;
        a=(S_1[a]+86)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<16;
        y |=(u64)(( s_1[(tempData64>>48)&15]+15)&15)<<48;
        y |=(u64)(( S_1[(tempData64>>52)&255]-253)&255)<<52;
        y=y^((tempData64>>60)&0xffffffff&0xf)<<16;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x7fbd1e8b*b+0xb39f1919);
        b ^=P(0x7fbd1e8b*a+0xb39f1919);
        a ^=P(0x7fbd1e8b*b+0xb39f1919);
        tempData64 = (u64)b<<32 | a;
        y=0;c=(43691*((tempData64>>8 ^ tempData64>>24)-34547))&65535;
        a=(171*((tempData64>>24 ^ tempData64>>32)-35))&255;
        b=(S_1[(tempData64>>32)&255]-213)&255;
        b=(171*((b ^a)-171))&255;
        a=(S_1[a]+222)&255;
        d=b<<8|a;
        d=(43691*((c^d)-63807))&65535;
        a=(171*((c>>8 ^ c)-155))&255;
        b=(S_1[(c>>8)&255]+138)&255;
        b=(171*((b ^a)-215))&255;
        a=(S_1[a]-138)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<8;
        a=(171*((tempData64>>40 ^ tempData64>>48)-225))&255;
        //60
        b=(S_1[(tempData64>>48)&255]+86)&255;
        b=(171*((b ^a)-67))&255;
        a=(S_1[a]-146)&255;
        y |= (u64)(b<<8|a)<<40;
        y |=(u64)(( s_1[(tempData64>>56)&15]-6)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-6)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]-139)&255)<<0;
        y=y^((tempData64>>8)&0xf&0xffffffff)<<60;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xe1564293*b+0xda362877);
        b ^=P(0xe1564293*a+0xda362877);
        a ^=P(0xe1564293*b+0xda362877);
        tempData64 = (u64)b<<32 | a;
        y=0;a=(171*((tempData64>>44 ^ tempData64>>52)-85))&255;
        //50
        b=(S_1[(tempData64>>52)&255]+244)&255;
        b=(171*((b ^a)-249))&255;
        a=(S_1[a]+95)&255;
        y |= (u64)(b<<8|a)<<44;
        y |=(u64)(( s_1[(tempData64>>60)&15]-13)&15)<<60;
        c=(43691*((tempData64>>0 ^ tempData64>>16)-8917))&65535;
        a=(171*((tempData64>>16 ^ tempData64>>24)-171))&255;
        b=(S_1[(tempData64>>24)&255]+222)&255;
        b=(171*((b ^a)-249))&255;
        a=(S_1[a]+62)&255;
        d=b<<8|a;
        d=(43691*((c^d)-39819))&65535;
        a=(171*((c>>8 ^ c)-215))&255;
        b=(S_1[(c>>8)&255]-138)&255;
        b=(171*((b ^a)-153))&255;
        a=(S_1[a]+11)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64)(( S_1[(tempData64>>32)&255]-242)&255)<<32;
        y |=(u64)(( s_1[(tempData64>>40)&15]-2)&15)<<40;
        y=y^((tempData64>>44)&0xff&0xffff)<<32;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xabdef93f*b+0x86f222d5);
        b ^=P(0xabdef93f*a+0x86f222d5);
        a ^=P(0xabdef93f*b+0x86f222d5);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( S_1[(tempData64>>36)&255]-91)&255)<<36;
        y |=(u64)(( s_1[(tempData64>>44)&15]+0)&15)<<44;
        y |=(u64)(( s_1[(tempData64>>48)&15]-15)&15)<<48;
        y |=(u64)(( s_1[(tempData64>>52)&15]-3)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]+15)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+4)&15)<<60;
        a=(171*((tempData64>>0 ^ tempData64>>8)-153))&255;
        //52
        b=(S_1[(tempData64>>8)&255]+11)&255;
        b=(171*((b ^a)-191))&255;
        a=(S_1[a]-173)&255;
        y |= (u64)(b<<8|a)<<0;
        y |=(u64)(( S_1[(tempData64>>16)&255]-138)&255)<<16;
        y |=(u64)(( s_1[(tempData64>>24)&15]+10)&15)<<24;
        y |=(u64)(( S_1[(tempData64>>28)&255]+62)&255)<<28;
        y=y^((tempData64>>36)&0xf&0xff)<<44;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x990bbeaf*b+0x9b8ad68b);
        b ^=P(0x990bbeaf*a+0x9b8ad68b);
        a ^=P(0x990bbeaf*b+0x9b8ad68b);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>56)&15]+11)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-10)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]+70)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]+238)&255)<<8;
        y |=(u64)(( s_1[(tempData64>>16)&15]-11)&15)<<16;
        y |=(u64)(( s_1[(tempData64>>20)&15]+0)&15)<<20;
        c=(43691*((tempData64>>24 ^ tempData64>>40)-39179))&65535;
        a=(171*((tempData64>>40 ^ tempData64>>48)-191))&255;
        b=(S_1[(tempData64>>48)&255]-173)&255;
        b=(171*((b ^a)-85))&255;
        a=(S_1[a]+244)&255;
        d=b<<8|a;
        d=(43691*((c^d)-63839))&65535;
        a=(171*((c>>8 ^ c)-151))&255;
        b=(S_1[(c>>8)&255]-179)&255;
        b=(171*((b ^a)-193))&255;
        a=(S_1[a]-111)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<24;
        y=y^((tempData64>>56)&0xf&0xf)<<16;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x96b3c06f*b+0x55f4f95f);
        b ^=P(0x96b3c06f*a+0x55f4f95f);
        a ^=P(0x96b3c06f*b+0x55f4f95f);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>52)&15]-13)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]+2)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+5)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]+28)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]+235)&255)<<8;
        a=(171*((tempData64>>16 ^ tempData64>>24)-155))&255;
        //43
        b=(S_1[(tempData64>>24)&255]+70)&255;
        b=(171*((b ^a)-237))&255;
        a=(S_1[a]-106)&255;
        y |= (u64)(b<<8|a)<<16;
        a=(171*((tempData64>>32 ^ tempData64>>40)-47))&255;
        //45
        b=(S_1[(tempData64>>40)&255]-91)&255;
        b=(171*((b ^a)-197))&255;
        a=(S_1[a]+238)&255;
        y |= (u64)(b<<8|a)<<32;
        y |=(u64)(( s_1[(tempData64>>48)&15]+0)&15)<<48;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xc5ee9b47*b+0xb1e02e5b);
        b ^=P(0xc5ee9b47*a+0xb1e02e5b);
        a ^=P(0xc5ee9b47*b+0xb1e02e5b);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>16)&15]-3)&15)<<16;
        a=(171*((tempData64>>20 ^ tempData64>>28)-211))&255;
        //35
        b=(S_1[(tempData64>>28)&255]+165)&255;
        b=(171*((b ^a)-169))&255;
        a=(S_1[a]+79)&255;
        y |= (u64)(b<<8|a)<<20;
        a=(171*((tempData64>>36 ^ tempData64>>44)-185))&255;
        //37
        b=(S_1[(tempData64>>44)&255]-77)&255;
        b=(171*((b ^a)-149))&255;
        a=(S_1[a]+85)&255;
        y |= (u64)(b<<8|a)<<36;
        y |=(u64)(( s_1[(tempData64>>52)&15]+2)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]+5)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+12)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]+235)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]-106)&255)<<8;
        y=y^((tempData64>>16)&0xf&0xf)<<56;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xd91c5307*b+0xec6a85eb);
        b ^=P(0xd91c5307*a+0xec6a85eb);
        a ^=P(0xd91c5307*b+0xec6a85eb);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>56)&15]-0)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-10)&15)<<60;
        c=(43691*((tempData64>>0 ^ tempData64>>16)-38229))&65535;
        a=(171*((tempData64>>16 ^ tempData64>>24)-211))&255;
        b=(S_1[(tempData64>>24)&255]+165)&255;
        b=(171*((b ^a)-169))&255;
        a=(S_1[a]+79)&255;
        d=b<<8|a;
        d=(43691*((c^d)-50771))&65535;
        a=(171*((c>>8 ^ c)-151))&255;
        b=(S_1[(c>>8)&255]-2)&255;
        b=(171*((b ^a)-175))&255;
        a=(S_1[a]+133)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<0;
        y |=(u64)(( S_1[(tempData64>>32)&255]-77)&255)<<32;
        a=(171*((tempData64>>40 ^ tempData64>>48)-83))&255;
        //39
        b=(S_1[(tempData64>>48)&255]+5)&255;
        b=(171*((b ^a)-105))&255;
        a=(S_1[a]+50)&255;
        y |= (u64)(b<<8|a)<<40;
        y=y^((tempData64>>56)&0xffff&0xf)<<40;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x9555d3a7*b+0x6932b84d);
        b ^=P(0x9555d3a7*a+0x6932b84d);
        a ^=P(0x9555d3a7*b+0x6932b84d);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>0)&15]+4)&15)<<0;
        c=(43691*((tempData64>>4 ^ tempData64>>20)-44933))&65535;
        a=(171*((tempData64>>20 ^ tempData64>>28)-139))&255;
        b=(S_1[(tempData64>>28)&255]-10)&255;
        b=(171*((b ^a)-209))&255;
        a=(S_1[a]-208)&255;
        d=b<<8|a;
        d=(43691*((c^d)-10201))&65535;
        a=(171*((c>>8 ^ c)-107))&255;
        b=(S_1[(c>>8)&255]+143)&255;
        b=(171*((b ^a)-71))&255;
        a=(S_1[a]+197)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<4;
        y |=(u64)(( S_1[(tempData64>>36)&255]-2)&255)<<36;
        y |=(u64)(( S_1[(tempData64>>44)&255]-83)&255)<<44;
        y |=(u64)(( S_1[(tempData64>>52)&255]+79)&255)<<52;
        y |=(u64)(( s_1[(tempData64>>60)&15]+5)&15)<<60;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x9602af87*b+0xa94fc653);
        b ^=P(0x9602af87*a+0xa94fc653);
        a ^=P(0x9602af87*b+0xa94fc653);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( S_1[(tempData64>>48)&255]+20)&255)<<48;
        y |=(u64)(( s_1[(tempData64>>56)&15]-3)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+12)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]-220)&255)<<0;
        c=(43691*((tempData64>>8 ^ tempData64>>24)-35339))&65535;
        a=(171*((tempData64>>24 ^ tempData64>>32)-209))&255;
        b=(S_1[(tempData64>>32)&255]-208)&255;
        b=(171*((b ^a)-39))&255;
        a=(S_1[a]+216)&255;
        d=b<<8|a;
        d=(43691*((c^d)-27535))&65535;
        a=(171*((c>>8 ^ c)-71))&255;
        b=(S_1[(c>>8)&255]+197)&255;
        b=(171*((b ^a)-5))&255;
        a=(S_1[a]+52)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<8;
        y |=(u64)(( s_1[(tempData64>>40)&15]+5)&15)<<40;
        y |=(u64)(( s_1[(tempData64>>44)&15]-2)&15)<<44;
        y=y^((tempData64>>48)&0xff&0xff)<<0;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0x27d86b8f*b+0x8a0ad0d1);
        b ^=P(0x27d86b8f*a+0x8a0ad0d1);
        a ^=P(0x27d86b8f*b+0x8a0ad0d1);
        tempData64 = (u64)b<<32 | a;
        y=0;c=(43691*((tempData64>>20 ^ tempData64>>36)-39427))&65535;
        a=(171*((tempData64>>36 ^ tempData64>>44)-95))&255;
        b=(S_1[(tempData64>>44)&255]+20)&255;
        b=(171*((b ^a)-183))&255;
        a=(S_1[a]+59)&255;
        d=b<<8|a;
        d=(43691*((c^d)-32269))&65535;
        a=(171*((c>>8 ^ c)-141))&255;
        b=(S_1[(c>>8)&255]-145)&255;
        b=(171*((b ^a)-195))&255;
        a=(S_1[a]-182)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<20;
        y |=(u64)(( s_1[(tempData64>>52)&15]+12)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]-12)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+4)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]+197)&255)<<0;
        y |=(u64)(( s_1[(tempData64>>8)&15]+15)&15)<<8;
        y |=(u64)(( S_1[(tempData64>>12)&255]+216)&255)<<12;
        y=y^((tempData64>>20)&0xf&0xffffffff)<<8;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xa6dcd75f*b+0x47c50535);
        b ^=P(0xa6dcd75f*a+0x47c50535);
        a ^=P(0xa6dcd75f*b+0x47c50535);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>36)&15]-0)&15)<<36;
        y |=(u64)(( S_1[(tempData64>>40)&255]-171)&255)<<40;
        y |=(u64)(( S_1[(tempData64>>48)&255]-209)&255)<<48;
        y |=(u64)(( s_1[(tempData64>>56)&15]-10)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-6)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]-145)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]-13)&255)<<8;
        y |=(u64)(( s_1[(tempData64>>16)&15]+11)&15)<<16;
        a=(171*((tempData64>>20 ^ tempData64>>28)-155))&255;
        //22
        b=(S_1[(tempData64>>28)&255]-3)&255;
        b=(171*((b ^a)-95))&255;
        a=(S_1[a]+20)&255;
        y |= (u64)(b<<8|a)<<20;
        y=y^((tempData64>>36)&0xffff&0xf)<<20;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xb73b7e0f*b+0x9a035f15);
        b ^=P(0xb73b7e0f*a+0x9a035f15);
        a ^=P(0xb73b7e0f*b+0x9a035f15);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>0)&15]-0)&15)<<0;
        y |=(u64)(( s_1[(tempData64>>4)&15]+2)&15)<<4;
        y |=(u64)(( S_1[(tempData64>>8)&255]-133)&255)<<8;
        y |=(u64)(( s_1[(tempData64>>16)&15]-13)&15)<<16;
        y |=(u64)(( s_1[(tempData64>>20)&15]-0)&15)<<20;
        c=(43691*((tempData64>>24 ^ tempData64>>40)-32269))&65535;
        a=(171*((tempData64>>40 ^ tempData64>>48)-141))&255;
        b=(S_1[(tempData64>>48)&255]-145)&255;
        b=(171*((b ^a)-195))&255;
        a=(S_1[a]-182)&255;
        d=b<<8|a;
        d=(43691*((c^d)-55339))&65535;
        a=(171*((c>>8 ^ c)-49))&255;
        b=(S_1[(c>>8)&255]-209)&255;
        b=(171*((b ^a)-67))&255;
        a=(S_1[a]-171)&255;
        c=b<<8|a;
        y|=(u64)(d<<16|c)<<24;
        y |=(u64)(( s_1[(tempData64>>56)&15]+11)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]+4)&15)<<60;
        y=y^((tempData64>>0)&0xf&0xf)<<16;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xd82a30d3*b+0x8c91c2b7);
        b ^=P(0xd82a30d3*a+0x8c91c2b7);
        a ^=P(0xd82a30d3*b+0x8c91c2b7);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>40)&15]+15)&15)<<40;
        y |=(u64)(( s_1[(tempData64>>44)&15]+10)&15)<<44;
        y |=(u64)(( S_1[(tempData64>>48)&255]-16)&255)<<48;
        y |=(u64)(( S_1[(tempData64>>56)&255]+64)&255)<<56;
        a=(171*((tempData64>>0 ^ tempData64>>8)-191))&255;
        //10
        b=(S_1[(tempData64>>8)&255]+66)&255;
        b=(171*((b ^a)-95))&255;
        a=(S_1[a]-64)&255;
        y |= (u64)(b<<8|a)<<0;
        a=(171*((tempData64>>16 ^ tempData64>>24)-205))&255;
        //12
        b=(S_1[(tempData64>>24)&255]-61)&255;
        b=(171*((b ^a)-85))&255;
        a=(S_1[a]-133)&255;
        y |= (u64)(b<<8|a)<<16;
        y |=(u64)(( S_1[(tempData64>>32)&255]-16)&255)<<32;
        y=y^((tempData64>>40)&0xff&0xf)<<32;
        tempData64=y;
        a = (u32)(tempData64 &0xffffffff);
        b=(u32)(tempData64>>32);
        a ^=P(0xcc3d5487*b+0x42ab9a11);
        b ^=P(0xcc3d5487*a+0x42ab9a11);
        a ^=P(0xcc3d5487*b+0x42ab9a11);
        tempData64 = (u64)b<<32 | a;
        y=0;y |=(u64)(( s_1[(tempData64>>52)&15]+5)&15)<<52;
        y |=(u64)(( s_1[(tempData64>>56)&15]+3)&15)<<56;
        y |=(u64)(( s_1[(tempData64>>60)&15]-10)&15)<<60;
        y |=(u64)(( S_1[(tempData64>>0)&255]-90)&255)<<0;
        y |=(u64)(( S_1[(tempData64>>8)&255]+63)&255)<<8;
        a=(171*((tempData64>>16 ^ tempData64>>24)-61))&255;
        //7
        b=(S_1[(tempData64>>24)&255]-16)&255;
        b=(171*((b ^a)-135))&255;
        a=(S_1[a]+106)&255;
        y |= (u64)(b<<8|a)<<16;
        y |=(u64)(( s_1[(tempData64>>32)&15]+0)&15)<<32;
        a=(171*((tempData64>>36 ^ tempData64>>44)-191))&255;
        //10
        b=(S_1[(tempData64>>44)&255]+66)&255;
        b=(171*((b ^a)-95))&255;
        a=(S_1[a]-64)&255;
        y |= (u64)(b<<8|a)<<36;
        y=y^((tempData64>>52)&0xff&0xf)<<0;
        tempData64=y;
        *(plaintxt+block) = tempData64;
    }
    return block;
}

int selfCheckSDK(void)
{
    u64 iData=0x0000000000000000,vData=0x13a3488ae3ccc20c;
    encryptZTA(&iData,1,&iData);
    decryptZTB(&iData,1,&iData);
    encryptZUA(&iData,1,&iData);
    decryptZUB(&iData,1,&iData);
    encryptZSA(&iData,1,&iData);
    decryptZSB(&iData,1,&iData);
    if(iData==vData) return 0;
    else return -1;
}

void getVersion(char * buff)
{
    if(buff != NULL) sprintf(buff, "%s", "1.0.0");
}
